2017-08-28 11 views
1

コールバックをパラメータとする関数を定義し、そのコールバックのパラメータが必要になります。 Typescriptは、パラメータの型が一致しないコールバックを正しく報告しますが、期待される引数がないコールバックについては何も言いません。Typescript:必須のコールバックパラメータ?

なぜ第2のonはエラーではないと呼びますか?エラーになる方法はありますか?

function on(callback: (num: number) => void) { 
    callback(5); 
} 

on((string:bob) => { // typescript error 
    console.log("What"); 
}); 

on(() => { // no typescript error? 
    console.log("What"); 
}); 

答えて

1

これを行う方法はありません。呼び出し側が提供するよりも少ないパラメータを持つ

コールバックは、JavaScriptで極めて共通している - すべては、3つの以上の引数を提供しますが、頻繁にコールバックとして1パラメータの機能を与えられている機能などmapfilterforEachのように。

+1

私はTypescriptが必要なパラメータでコールバックを定義する方法を提供すると考えました。 – Jazcash

+3

しかし、 'doThing(コールバック:(num !: number)...')のようなものは、 '?'オプションのパラメータ識別子と異なり、クールです。コールバックの本体でそのパラメータを使用したいのですか? – Stephan

0

ハンドラのタイプを定義できます。これで、文字列引数を持つコールバックのみを渡すことができます。

// define a handler so you can use it for callbacks 
type Handler = (t: string) => void; 

function doSomething(t: string): void { 
    console.log("hello " + t) 
} 

function thisFirst(callback: Handler) { 
    callback('world') // ok 
    callback(4) // not assignable to type 'string' 
} 

thisFirst(doSomething) 
+0

これはOPが尋ねていることには対処していません。 – Louis

+0

私の解決策は、匿名のコールバックをまったく使用するのではなく、型と関数名を定義するだけです私の考えでは、よりクリーンで読みやすいコードになりますが、それはちょっと意見です:-) – Kokodoko

+0

匿名かどうかは問題の要因ではありません。答えに表示されるコードをとり、 'doSomething'を以下のように定義します:' function doSomething():void {'。 'doSomething'から' t'への参照を削除します。あなたはまだ 'thisFirst(doSomething)'を実行しても、その呼び出しでコンパイルエラーが発生することはありません。 – Louis