【发布时间】:2017-04-27 03:05:46
【问题描述】:
class A {
type: string
}
interface AClass<T extends A> {
prototype: T
}
function isType<T extends A>(a: A, aClass: AClass<T>): a is T {
return a.type === aClass.prototype.type
}
class B extends A {
foo: string
}
class C extends A {}
function check(a: A) {
if (isType(a, B)) {
return
}
a.type // ok
if (isType(a, C)) {
return
}
a.type // Property 'type' does not exist on type 'never'.
}
当派生类没有任何独特的属性时会出现错误。这发生在我将 TS 更新到 2.1.4 之后。我的问题是:
-
为什么会出现错误?我的猜测是 TS 绕过了自定义类型检查并将
A和C视为具有相同类型,因此将无法到达下一条语句,a将具有类型never。 有没有比在派生类中添加虚拟属性更好的解决方案?
【问题讨论】:
标签: typescript typescript2.0 typescript2.1