轉載
TypeScript基礎入門 - 泛型 - 泛型類型
項目實踐倉庫
https:// github.com/durban89/typescript_demo.git
tag: 1.3.2
為了保證後面的學習示範需要安裝下ts-node,這樣後面的每個操作都能直接運作看到輸出的結果。
npm install -D ts-node
後面自己在練習的時候可以這樣使用
npx ts-node 腳本路徑
泛型
泛型類型
上一篇文章的分享,我們建立了identity通用函數,可以适用于不同的類型。 在這次分享中分享一下函數本身的類型,以及如何建立泛型接口。泛型函數的類型與非泛型函數的類型沒什麼不同,隻是有一個類型參數在最前面,像函數聲明一樣,如下
function identity<T> (arg: T) : T {
return arg;
}
let otherIdentity: <T> (arg: T) => T = identity;
我們也可以使用不同的泛型參數名,隻要在數量上和使用方式上能對應上就可以,如下
function identity<T> (arg: T) : T {
return arg;
}
let other1Identity: <U> (arg: U) => U = identity;
我們還可以使用帶有調用簽名的對象字面量來定義泛型函數,如下
function identity<T> (arg: T) : T {
return arg;
}
let other2Identity: { <U>(arg: U): U } = identity;
這引導我們去寫第一個泛型接口了。 我們把上面例子裡的對象字面量拿出來做為一個接口,如下
function identity<T> (arg: T) : T {
return arg;
}
interface GenerateIdentityFunc {
<U> (arg: U): U;
}
let other3Identity: GenerateIdentityFunc = identity;
一個相似的例子,我們可能想把泛型參數當作整個接口的一個參數。 這樣我們就能清楚的知道使用的具體是哪個泛型類型(比如: Dictionary<string>而不隻是Dictionary)。 這樣接口裡的其它成員也能知道這個參數的類型了。
function identity<T> (arg: T) : T {
return arg;
}
interface GenerateIdentityFunc1<U> {
(arg: U): U
}
let other4Identity: GenerateIdentityFunc1<number> = identity;
注意,我們的示例做了少許改動。 不再描述泛型函數,而是把非泛型函數簽名作為泛型類型一部分。 當我們使用 GenerateIdentityFunc1的時候,還得傳入一個類型參數來指定泛型類型(這裡是:number),鎖定了之後代碼裡使用的類型。 對于描述哪部分類型屬于泛型部分來說,了解何時把參數放在調用簽名裡和何時放在接口上是很有幫助的。
除了泛型接口,我們還可以建立泛型類。 注意,無法建立泛型枚舉和泛型命名空間。
本執行個體結束實踐項目位址
https:// github.com/durban89/typescript_demo.git
tag: 1.3.3