在条件中更改变量的类型

时间:2017-05-18 10:42:03

标签: typescript

我非常喜欢这种方式,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)=>{...});
}

1 个答案:

答案 0 :(得分:3)