属性'prop'在类型'A |中不存在。 B'

时间:2019-03-14 17:32:01

标签: javascript node.js typescript

我正在从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()

2 个答案:

答案 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类型仅允许您访问两个目录中都存在的属性。