定义TypeScript回调类型

问题描述 投票:127回答:6

我在TypeScript中有以下类:

class CallbackTest
{
    public myCallback;

    public doWork(): void
    {
        //doing some work...
        this.myCallback(); //calling callback
    }
}

我正在使用这样的类:

var test = new CallbackTest();
test.myCallback = () => alert("done");
test.doWork();

代码有效,因此它会按预期显示消息框。

我的问题是:我可以为我的班级字段myCallback提供任何类型吗?现在,公共领域myCallbackany类型,如上所示。如何定义回调的方法签名?或者我可以将类型设置为某种回调类型?或者我可以做些什么吗?我是否必须使用any(隐式/显式)?

我试过这样的东西,但它不起作用(编译时错误):

public myCallback: ();
// or:
public myCallback: function;

我在网上找不到任何解释,所以我希望你能帮助我。

types callback typescript
6个回答
177
投票

我刚刚在TypeScript语言规范中找到了一些东西,它相当容易。我非常接近。

语法如下:

public myCallback: (name: type) => returntype;

在我的例子中,它将是

class CallbackTest
{
    public myCallback: () => void;

    public doWork(): void
    {
        //doing some work...
        this.myCallback(); //calling callback
    }
}

128
投票

为了更进一步,您可以声明一个指向函数签名的类型指针,如:

interface myCallbackType { (myArgument: string): void }

并像这样使用它:

public myCallback : myCallbackType;

51
投票

您可以声明一个新类型:

declare type MyHandler = (myArgument: string) => void;

var handler: MyHandler;

Update.

declare关键字不是必需的。它应该在.d.ts文件或类似情况下使用。


28
投票

这是一个例子 - 不接受任何参数并且不返回任何参数。

class CallbackTest
{
    public myCallback: {(): void;};

    public doWork(): void
    {
        //doing some work...
        this.myCallback(); //calling callback
    }
}

var test = new CallbackTest();
test.myCallback = () => alert("done");
test.doWork();

如果您想接受参数,也可以添加它:

public myCallback: {(msg: string): void;};

如果你想返回一个值,你也可以添加它:

public myCallback: {(msg: string): number;};

9
投票

如果您想要通用功能,可以使用以下功能。虽然它似乎没有在任何地方记录。

class CallbackTest {
  myCallback: Function;
}   

1
投票

尝试将回调添加到事件侦听器时,我遇到了同样的错误。奇怪的是,将回调类型设置为EventListener解决了它。它看起来比将整个函数签名定义为类型更优雅,但我不确定这是否是正确的方法。

class driving {
    // the answer from this post - this works
    // private callback: () => void; 

    // this also works!
    private callback:EventListener;

    constructor(){
        this.callback = () => this.startJump();
        window.addEventListener("keydown", this.callback);
    }

    startJump():void {
        console.log("jump!");
        window.removeEventListener("keydown", this.callback);
    }
}

0
投票

您可以使用以下内容:

  1. 输入别名(使用type关键字,别名函数文字)
  2. 接口
  3. 函数文字

以下是如何使用它们的示例:

type myCallbackType = (arg1: string, arg2: boolean) => number;

interface myCallbackInterface { (arg1: string, arg2: boolean): number };

class CallbackTest
{
    // ...

    public myCallback2: myCallbackType;
    public myCallback3: myCallbackInterface;
    public myCallback1: (arg1: string, arg2: boolean) => number;

    // ...

}
© www.soinside.com 2019 - 2024. All rights reserved.