此代码:
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
批句子?
答案 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
}