我不明白為什么會出現錯誤 2322。
請檢查以下代碼片段:
interface Fish {
alive: string | boolean;
}
class FishClass implements Fish {
alive = 'Yes'
constructor() {
// Type 'boolean' is not assignable to type 'string'.(2322)
this.alive = true;
}
}
介面定義了字串的聯合型別 | 布林值。
當我將兩種可能型別之一分配給實作介面的類中的欄位時,為什么型別是固定的?
uj5u.com熱心網友回復:
盡管大多數人都抱有期望,但類成員并沒有按照它們宣告要實作或擴展的型別進行背景關系型別化。類上的extendsorimplements宣告對類實體的型別沒有任何影響。相反,它只是在事后根據超類或介面檢查類。因此,如果您的類未能實作或擴展您宣告的內容,您將收到編譯器警告。但是當涉及到結果型別時,它就像你完全洗掉了extendsorimplements子句一樣。不,沒有人喜歡這個。
解決這個問題的原始請求請參見microsoft/TypeScript#3667,并且在microsoft/TypeScript#6118 上有過嘗試,但最終由于現有庫的一些問題而被放棄;看到這個評論。關于此有幾個未解決的問題,包括microsoft/TypeScript#32082;如果你想看到這個問題得到解決,你可能想轉到那個問題并給它一個 ??,但現在我們只需要接受這樣一個事實,class Foo implements Bar {/*...*/}它對Fooas的型別有相同的影響 class Foo {/*...*/}。
在您的情況下,這意味著class FishClass implements Fish {/*...*/}行為與class FishClass {/*...*/}推斷成員的方式完全相同。由于該alive屬性的初始化string值為"Yes",因此編譯器推斷它的型別為string。稍后當您分配true給它時,這是一個錯誤,因為您無法將 a 分配boolean給 a string。注意string可以賦值給string | boolean,所以檢查FishClass implements Fish成功;您可以縮小子型別的屬性。
現在處理這個問題的正確方法是手動注釋具有所需型別的欄位:
class FishClass implements Fish {
alive: string | boolean = 'Yes'; // okay
constructor() {
this.alive = true; // okay
}
}
Playground 鏈接到代碼
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/363445.html
標籤:javascript 打字稿 班级 类型 前端
