簡體   English   中英

屬性'prop'在類型'A |中不存在。 B'

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM