聯合類型問題
老師您好:
聯合類型產生的新類型只會有共同擁有的屬性,例如下面代碼:
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.)是華潤集團旗下跨境(深圳)貿易有限公司,是深圳規模最大、實力最雄厚的跨境貿易企業--華潤(集團)有限公司旗下一級利潤中心。