TypeScript extends 有三種用法,語義和應用場景上有所不同,因此筆記起來讓自己參考使用。
Extends 用法
- 介面繼承
- 泛型約束
- 條件判斷
介面繼承
用法:
|
在介面繼承中,extends 用於建立子介面繼承父介面的關係,讓子介面自動擁有父介面的屬性和方法。這是用來組織結構的機制,使得子介面能夠在基礎之上擴展屬性。
範例:
Admin 繼承了 Role,並且另外增加 permissions 屬性。這種 extends 用法建立了一個結構性的繼承關係,僅適用於介面和類別之間的繼承。
|
泛型約束
用法:
|
在泛型的型別參數中,extends 用來限制泛型參數的型別範圍,確保泛型符合特定型別或結構。
範例:
在這裡,T extends Role 限制 T 必須符合 Role 的結構,這樣 T 才能被 printRole 函式使用。這種 extends 用法用於型別約束,並非建立繼承或子介面,只是限制了泛型的使用範圍。
|
條件判斷(Conditional Types)
用法:
|
這個 extends 表達式用於條件型別判斷,而不是用來建立繼承或約束型別。extends 用來進行條件判斷時,類似於三元運算符 (? :) 用法。這樣可以根據型別 T 是否符合 SomeType 的結構來決定回傳 TrueType 還是 FalseType。
範例:
以下範例,T extends U ? never : T 用來排除聯合型別 T 中的指定型別 U。TypeScript 的條件型別會對聯合型別的每個成員單獨應用條件,並將結果合併為一個新的聯合型別。
|
要注意的是,TypeScript 型別系統中並沒有 if / else 以及 switch 判斷,因此只能透過多層的條件型別來進行判斷。例如,判斷 HTTP 方法類型:
|
延伸:infer 在條件判斷中的型別推斷
在符合條件的情況下,使用 infer 來進行型別推斷,提取型別使用。
範例:
以下條件型別判斷 T 是否是 Promise<U>。如果是,則回傳推斷出來的型別 U;否則,回傳 T 本身。
|
比較表
| 用法 | 說明 | 作用對象 |
|---|---|---|
| 介面繼承 | 建立子介面繼承父介面的屬性和方法 | 介面繼承介面 |
| 泛型約束 | 限制泛型的型別範圍,使泛型符合某結構 | 泛型參數的型別限制 |
| 條件判斷 | 判斷型別結構,並根據條件決定回傳的型別 | 泛型參數的型別判斷 |
參考資源:
https://chentsulin.medium.com/typescript-infer-的強大功用-9b43c4eac6fb
Nuxt3 入門:打造 SSR 專案
評論