我正在从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()
答案 0 :(得分:3)
将类型定义为A|B
时,这是TypeScript中的Union Type。
使用联合类型时,默认情况下,打字稿仅允许您使用两种类型上都存在的属性。在这种情况下,示例为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
}
答案 1 :(得分:2)
该错误是有道理的。如果var doB
的定义类型是greeter
或 A
(而B
却不是),如何确定地调用A
定义了成员doB()
)?
我假设迎宾员的类型为A或B。那么为什么打字稿不允许我调用B的方法?
因为greeter
也可能是A
的一个实例,如果编译器允许,则会破坏类型安全性 。
具有A | B
类型仅允许您访问两个目录中都存在的属性。