此代码:
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
}