[英]TypeScript Interfaces: Property 'A' does not exist on type 'B | null'
[英]Property 'prop' does not exist on type 'A | B'
我正在从url中获取数据,如果满足特定条件,则将数据加载到类型B或它的超类A中。当将数据加载到B中时,打字稿无法识别其属性。 我收到以下代码以下错误:
类型“ A”上不存在属性“ doB”
class A {
greeting: string;
constructor(message: string) {
this.greeting = message;
}
doA() {
return "Hello, " + this.greeting;
}
}
class B extends A{
greeting: string;
constructor(message: string) {
super(message)
this.greeting = message;
}
doB() {
return "Hello, " + this.greeting;
}
}
let greeter: A|B = new B("world");
greeter.doB()
当您将类型定义为A|B
,这是TypeScript中的联合类型 。
使用联合类型时,默认情况下,打字稿仅允许您使用两种类型上都存在的属性。 在这种情况下, doA
就是一个例子。
但是,如果我们只能访问那些类型,那么类型就没有多大意义。 要访问仅在其中一个实例上存在的属性,您要做的就是确保其具有正确的实例类型或Type Gaurd。 在这种情况下,可以通过以下方式完成:
let greeter: A|B = new B("world");
if(greeter instanceof B) {
// Do just B things
} else if(greeter instanceof A) {
// Do only A things
}
该错误是有道理的。 如果var greeter
的定义类型是A
或 B
(并且A
没有定义成员doB()
),如何确定地调用doB
?
迎宾者的类型是A或BI。 那么为什么打字稿不允许我调用B的方法?
因为greeter
也可以是A
的实例, 如果编译器允许的话 ,它将破坏类型安全性。
有A | B
A | B
仅允许您访问两个目录中都存在的属性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.