2017-01-24 23 views
3

Gibt es eine Möglichkeit zu spezifizieren, dass eine Funktion jedes Objekt akzeptiert außer ein Versprechen für ein Argument?Jedes Objekt außer Promise?

(Ich mag die Compiler ein fehlendes "erwarten" Stichwort zu fangen.)

Antwort

3

Ja, irgendwie. Es gibt einen Trick Objekttyp mit bestimmten Eigenschaften zu verbieten, indem sie diese Eigenschaften mit optionalem void Typ deklarieren:

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'. 

Diese ziemlich grob ist, weil es gilt nicht-Versprechen wie diese

f({ then: 42 }); 

ablehnen Wenn dies wird immer ein Problem, können Sie es wie diese

type NotAPromise = { then?: NotAFunction }; 

zu erklären, wo NotAFunction von this answer kommt.

Verwandte Themen