2017-01-24 5 views
3

関数が任意のオブジェクトを受け入れるように指定する方法はありますか?を除く引数の場合はプロミス以外のオブジェクト?

は(私が行方不明「待つ」というキーワードをキャッチするようにコンパイラにしたいと思います。)

答えて

3

はい、一種の。オプションのvoidタイプでこれらのプロパティを宣言することによって、特定のプロパティを持つオブジェクト型を禁止するトリックがあります:

type NotAPromise = { then?: void }; 

function f(o: NotAPromise) { 
} 

f(1); // ok 
f({}); // ok 


f(Promise.resolve(2)); 

Argument of type 'Promise<number>' is not assignable to parameter of type 'NotAPromise'. 
    Types of property 'then' are incompatible. 
    Type '{ (onfulfilled?: (value: number) => number | PromiseLike<number>, onrejected?: (reason: any) => n...' is not assignable to type 'void'. 

それがあれば、この1

f({ then: 42 }); 

のような有効な非約束を拒否しますので、これは、粗むしろありますこれは今まであなたがNotAFunctionがthis answerから来ているこの

type NotAPromise = { then?: NotAFunction }; 

ようにそれを宣言しようとすることができる問題となります。

関連する問題