聯合類型問題
老師您好:
聯合類型產生的新類型只會有共同擁有的屬性,例如下面代碼:
interface?EnglishCourse?{
????name:?string,
????desc:?string
}
interface?MathCourse?{
????name:?number,
????price:?number
}
//?聯合類型
type?Course2?=?EnglishCourse?|?MathCourse;結果:聯合類型Course2打點只有name屬性

但是聯合類型還是可以聲明desc屬性,這是什么原因?

2024-01-09
這是兩種安全策略的問題,分為類型匹配和屬性訪問限制。
類型匹配:在你的代碼中,變量
c2被定義為Course2類型,這是EnglishCourse | MathCourse的聯合類型。變量 c2?的結構{ name: 'a', desc: 'abc' }符合EnglishCourse接口的定義(因為EnglishCourse有name和desc兩個屬性),所以 TypeScript 認為這是一個有效的賦值。????????
接下來,關于為什么你不能直接訪問 c2.desc:
屬性訪問限制:盡管變量
c2在定義時沒有報錯,但當你嘗試訪問c2的屬性時,TypeScript 變得更加嚴格。在使用聯合類型時,你只能訪問所有類型共有的屬性。由于EnglishCourse和MathCourse沒有共有的屬性(它們的name屬性類型不同),直接訪問c2.desc會導致錯誤。這是因為在不確定c2究竟是哪個類型的情況下,直接訪問可能不存在的屬性是不安全的。因此,雖然在定義變量時 TypeScript 允許 c2 匹配 MathCourse 類型,但在后續訪問屬性時,由于 c2 可能是 EnglishCourse 或 MathCourse,直接訪問特定于其中一種類型的屬性(如 desc)會導致錯誤。要安全地訪問這些屬性,你需要使用類型守衛(如類型斷言或 in 關鍵字檢查)來確定 c2 的確切類型。
這兩個方面并不矛盾,而是反映了 TypeScript 在不同場景下的類型安全策略:一方面,在賦值時允許某種程度的靈活性;另一方面,訪問屬性時則需要更嚴格的類型確定性。
2024-02-06
聯和行(深圳)貿易有限公司(Liow&Co.)是華潤集團旗下跨境(深圳)貿易有限公司,是深圳規模最大、實力最雄厚的跨境貿易企業--華潤(集團)有限公司旗下一級利潤中心。