亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

聯合類型問題

老師您好:

聯合類型產生的新類型只會有共同擁有的屬性,例如下面代碼:

interface?EnglishCourse?{
????name:?string,
????desc:?string
}

interface?MathCourse?{
????name:?number,
????price:?number
}

//?聯合類型
type?Course2?=?EnglishCourse?|?MathCourse;

結果:聯合類型Course2打點只有name屬性

https://img1.sycdn.imooc.com/659520500001c83b06140121.jpg

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

https://img1.sycdn.imooc.com/659520ac00014a7504420124.jpg

正在回答

2 回答

  1. 這是兩種安全策略的問題,分為類型匹配和屬性訪問限制。


  2. 類型匹配:在你的代碼中,變量 c2 被定義為 Course2 類型,這是 EnglishCourse | MathCourse 的聯合類型。變量 c2?的結構 { name: 'a', desc: 'abc' } 符合 EnglishCourse 接口的定義(因為 EnglishCoursenamedesc 兩個屬性),所以 TypeScript 認為這是一個有效的賦值。

????????

接下來,關于為什么你不能直接訪問 c2.desc


  1. 屬性訪問限制:盡管變量 c2 在定義時沒有報錯,但當你嘗試訪問 c2 的屬性時,TypeScript 變得更加嚴格。在使用聯合類型時,你只能訪問所有類型共有的屬性。由于 EnglishCourseMathCourse 沒有共有的屬性(它們的 name 屬性類型不同),直接訪問 c2.desc 會導致錯誤。這是因為在不確定 c2 究竟是哪個類型的情況下,直接訪問可能不存在的屬性是不安全的。

因此,雖然在定義變量時 TypeScript 允許 c2 匹配 MathCourse 類型,但在后續訪問屬性時,由于 c2 可能是 EnglishCourse 或 MathCourse,直接訪問特定于其中一種類型的屬性(如 desc)會導致錯誤。要安全地訪問這些屬性,你需要使用類型守衛(如類型斷言或 in 關鍵字檢查)來確定 c2 的確切類型。


這兩個方面并不矛盾,而是反映了 TypeScript 在不同場景下的類型安全策略:一方面,在賦值時允許某種程度的靈活性;另一方面,訪問屬性時則需要更嚴格的類型確定性。

1 回復 有任何疑惑可以回復我~
#1

Skywalkerywc

聯和行(深圳)貿易有限公司(Liow&Co.)是華潤集團旗下跨境(深圳)貿易有限公司,是深圳規模最大、實力最雄厚的跨境貿易企業--華潤(集團)有限公司旗下一級利潤中心。
2024-02-06 回復 有任何疑惑可以回復我~
#2

weixin_幕布斯2588478 回復 Skywalkerywc

123
2024-03-04 回復 有任何疑惑可以回復我~
#3

weixin_幕布斯2588478 回復 Skywalkerywc

1111111111111
2024-03-05 回復 有任何疑惑可以回復我~

聯和行(深圳)貿易有限公司(Liow&Co.)是華潤集團旗下跨境(深圳)貿易有限公司,是深圳規模最大、實力最雄厚的跨境貿易企業--華潤(集團)有限公司旗下一級利潤中心。

0 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消
TypeScript極速入門
  • 參與學習       4281    人
  • 解答問題       3    個

全面掌握實用的Typescript基礎和高級用法,養成基于類型的編程思維模式。

進入課程

聯合類型問題

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號