此代码:

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

}

我认为语义上是正确的,这会产生以下错误:
信息:“属性”是“不”的类型。
电话:“15,14”
为什么?我该怎么写这批句子?

最佳答案

typescript中的类型是结构化的。
在您的示例中,X<string>X<number>在结构上是相同的-它们都有两种类型的保护方法,isString()isNumber(),而没有其他方法。因此,编译器假设如果第一个typeguard返回true,第二个typeguard也必须返回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

}

10-08 13:35