在条件中更改变量类型

Mic*_*l K 3 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();
Run Code Online (Sandbox Code Playgroud)

然而,鸭子打字并不是那么好......

//3: duck typing: not so great...
if ((<PromiseLike<Foo|Fun>>X).then) return X.then((X)=>{...});
Run Code Online (Sandbox Code Playgroud)

相反,你必须写:

if ((<PromiseLike<Foo|Fun>>X).then) return (<PromiseLike<Foo|Fun>>X).then((X)=>{...});
Run Code Online (Sandbox Code Playgroud)

如果您在块中多次使用 X ,这很烦人。我经常使用鸭子类型来找出对象是哪种(接口)类型。

有没有办法定义一个变量在块范围内具有更窄的类型?

例如:

if ((<PromiseLike<Foo|Fun>>X).then) {
  narrow X:PromiseLike<Foo|Fun>;
  return X.then((X)=>{...});
}
Run Code Online (Sandbox Code Playgroud)

当然可以声明一个新变量,但我不喜欢那样,因为它是作用域中的一个新名称,而不是相同的名称:

if ((<PromiseLike<Foo|Fun>>X).then) {
  const X2 = <PromiseLike<Foo|Fun>>X;
  return X2.then((X)=>{...});
}
Run Code Online (Sandbox Code Playgroud)