泛用型別可以視為是將 型別化名 進行 參數化 的行為,任何型別都可以轉換成泛用型別。目的是為了讓 型別化名 能更彈性的運用。
簡單看個範例:
在 Identity<T>
中的 T
,我們視為是泛用型別
宣告時的參數,稱為型別參數(Type Parameter)。
若還是很難懂,可以想成 函式
宣告時的參數 function call(T){}
,呼叫時可以帶入各種變數值。
但使用泛用型別時,型別參數只能放入型別,像是 number
, string
等其他篇章提及的型別。
當我們將 T
取代成 number
,則 Identity<number>
的結果就會是 number
。
陣列型別 - Array<T>
,這是內建的泛用型別,等同於 T[]
。可以想成內建已經先將陣列宣告進行型別化名。
還記得我們在 <Day04:型別系統 - 明文型別 Literal Type 與 型別化名> 的最後有談過 選用屬性 嗎?
而條件型別最常見的是 Required<T>
,它可以將所有 T
中的選用屬性,轉為必要屬性。
我們用之前的範例來看:
接著我們使用 Required<T>
:
若沒有使用 Required
,這段語法可以正常運作,因為 birthday
是選用屬性。但當我們使用 Required<T>
,就會強制將 birthday
轉為必要屬性。
除了型別(Types),函式(Function)、介面(Interface)與類別(Class),也都可轉換成泛用型式。
以型別為例,我們若將 T
帶入 boolean
,但實際上屬性 name
的型別是 string
,TypeScript 就會顯示警告:
通常要針對函式做型別化名,會有一種特質,輸入參數 與 返回值 型別一致:
我們也可以在宣告函式時,宣告為泛用形式:
系列:
跑完 JS30 就接著認識 TypeScript 入門
上一篇:Day06:型別系統 - 複合型別 Composite Types
下一篇:Day08:型別系統 - 索引型別 Indexable Types
跑完 JS30 就接著認識 TypeScript 入門