除了承诺之外的任何对象?

时间:2017-01-24 16:59:57

标签: typescript

有没有办法指定函数接受任何Object ,除了参数的Promise?

(我希望编译器能够找到丢失的#34;等待"关键字。)

1 个答案:

答案 0 :(得分:4)

是的,有点儿。通过使用可选的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'.

这是相当粗糙的,因为它会拒绝像这样的有效非承诺

f({ then: 42 });

如果这成为一个问题,你可以试着像这样宣布它

type NotAPromise = { then?: NotAFunction };

其中NotAFunction来自this answer