我非常喜欢这种方式,typescript处理条件中的变量类型:
class Foo {
public bar(){...}
}
type Fun = ()=>void;
const X:Foo|Fun|PromiseLike<Foo|Fun> = whaeverReturnsFooOrFun();
...
//1: great!
if (X instanceof Foo) X.bar();
...
//2: great!
if (typeof(X) === 'function') X();
然而,鸭子打字并不是那么好......
//3: duck typing: not so great...
if ((<PromiseLike<Foo|Fun>>X).then) return X.then((X)=>{...});
相反,你必须写:
if ((<PromiseLike<Foo|Fun>>X).then) return (<PromiseLike<Foo|Fun>>X).then((X)=>{...});
如果你在块中多次使用X,这是相当烦人的。 我经常使用duck typing来查找对象的(interface-)类型。
有没有办法定义一个变量在块范围内的类型较窄?
E.g:
if ((<PromiseLike<Foo|Fun>>X).then) {
narrow X:PromiseLike<Foo|Fun>;
return X.then((X)=>{...});
}
当然可以声明一个新变量,但我不喜欢它,因为它是范围内的新名称而不是相同:
if ((<PromiseLike<Foo|Fun>>X).then) {
const X2 = <PromiseLike<Foo|Fun>>X;
return X2.then((X)=>{...});
}