![](/img/trans.png)
[英]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.