从不假设的通用型警卫

时间:2017-11-04 13:24:34

标签: typescript generics

此代码:

class X<T> {
  isString(): this is X<string> {
    return true;
  }

  isNumber(): this is X<number> {
    return false;
  }
}

const x = new X();

if (x.isString()) {

} else if (x.isNumber()) { // Line 15

}

我认为在语义上是正确的,会产生此错误:

  

消息:“物品'isNumber'在'never'类型上不存在。”   at:'15,14'

为什么呢?我该如何写if批句子?

1 个答案:

答案 0 :(得分:1)

打字稿中的类型是结构性的。

在您的示例中,X<string>X<number>在结构上完全相同 - 它们都有两种类型保护方法,isString()isNumber(),没有别的。因此,编译器假定如果第一个typeguard返回true,则第二个也必须返回true(因为实际上它们正在测试相同的类型),并且else分支无法访问。

只要您X实际依赖T,它就会编译:

class X<T> {
  t: T;

  isString(): this is X<string> {
    return true;
  }

  isNumber(): this is X<number> {
    return false;
  }
}

const x = new X();

if (x.isString()) {

} else if (x.isNumber()) { // Line 15

}