218

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か? 現在、 public フィールドは上記のようmyCallbackなタイプです。anyコールバックのメソッド シグネチャを定義するにはどうすればよいですか? または、タイプをある種のコールバックタイプに設定することはできますか? または、これらのどちらかを行うことはできますか? any(暗黙的/明示的)を使用する必要がありますか?

私はこのようなことを試みましたが、うまくいきませんでした (コンパイル時エラー):

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

オンラインでこれに関する説明が見つからなかったので、助けていただければ幸いです。

4

10 に答える 10

264

TypeScript言語仕様で何かを見つけました。それはかなり簡単です。私はかなり近かった。

構文は次のとおりです。

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

私の例では、

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

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

タイプエイリアスとして:

type MyCallback = (name: type) => returntype;
于 2012-10-30T10:51:45.260 に答える
176

さらに一歩進むには、次のような関数シグネチャへの型ポインターを宣言できます。

interface myCallbackType { (myArgument: string): void }

次のように使用します。

public myCallback : myCallbackType;
于 2013-01-10T01:39:07.477 に答える
68

新しい型を宣言できます:

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

var handler: MyHandler;

アップデート。

キーワードはdeclare不要です。.d.ts ファイルまたは同様の場合に使用する必要があります。

于 2015-10-16T14:52:45.357 に答える
42

以下に例を示します - パラメータを受け入れず、何も返しません。

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;};
于 2012-10-30T10:49:08.073 に答える
3

コールバックを含むインターフェイスを定義する方法の簡単な例を次に示します。

// interface containing the callback

interface AmazingInput {
    name: string
    callback: (string) => void  //defining the callback
}

// method being called

public saySomethingAmazing(data:AmazingInput) {
   setTimeout (() => {
     data.callback(data.name + ' this is Amazing!');
   }, 1000)

}

// create a parameter, based on the interface

let input:AmazingInput = {
    name: 'Joe Soap'
    callback: (message) => {
        console.log ('amazing message is:' + message);
    }
}

// call the method, pass in the parameter

saySomethingAmazing(input);

于 2021-03-26T11:48:27.447 に答える
2

I came across the same error when trying to add the callback to an event listener. Strangely, setting the callback type to EventListener solved it. It looks more elegant than defining a whole function signature as a type, but I'm not sure if this is the correct way to do this.

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);
    }
}
于 2017-04-24T09:12:55.223 に答える