TypeScript 泛型型別

admin發表於2018-08-26

由於作者本人也利用C#開發專案,深知泛型的便利性,可以建立支援多種資料型別的元件。

作為微軟的產品,可以有根據的猜測TypeScript中的泛型應該也有類似功能。

下面節通過程式碼例項介紹一下TypeScript中泛型的用法。

首先看一段程式碼例項:

[typescript] 純文字檢視 複製程式碼
function identity(arg: number): number {
  return arg;
}

上述程式碼建立一個函式,並且限定函式引數和返回值都為number型別。

為了增加靈活性,程式碼修改如下:

[typescript] 純文字檢視 複製程式碼
function identity(arg: any): any {
  return arg;
}

上面程式碼規定函式引數和返回值型別都是any。

關於any型別可以參閱TypeScript Any型別一章節。

Any型別缺點也比較明顯,可以傳遞任何型別資料,但不能保證返回值型別和傳遞進來引數型別一致。

假設給函式傳遞“螞蟻部落”,我們只知道返回值型別是Any,不知道具體何種型別。

[typescript] 純文字檢視 複製程式碼
function identity<T>(arg: T): T {
  return arg;
}

給函式新增型別變數T(使用尖括號<>包裹),它可以捕獲使用者傳入引數的型別,並且使用T作為返回值型別。

上面就是對泛型函式的描述,它可以保證傳遞進函式的引數型別與返回值型別完全一致。

泛型函式適用於多種型別,相較於使用any型別,它不會丟失型別資訊。

泛型函式的呼叫:

[typescript] 純文字檢視 複製程式碼
let str = identity<string>("螞蟻部落");

傳入所有引數,包括尖括號中的型別引數。

[typescript] 純文字檢視 複製程式碼
let str = identity("螞蟻部落");

省略泛型的型別引數,編譯器可以根據傳遞的引數自動推斷T的型別。

特別說明:表示泛型的T並不是固定的,可以使用其他字元,例如U。

前面以泛型函式為例子,介紹了泛型的基本概念和用法,下面再來介紹一下泛型函式的型別。

關於非泛型函式型別可以參閱TypeScript 函式型別一章節。

[typescript] 純文字檢視 複製程式碼
function identity<T>(arg: T): T {
    return arg;
}
let myIdentity: <T>(arg: T) => T = identity;

和普通函式的區別是,在函式簽名宣告的前面加上泛型型別引數<T>。

[typescript] 純文字檢視 複製程式碼
function identity<T>(arg: T): T {
    return arg;
}
let myIdentity: {<T>(arg: T): T} = identity;

可以使用帶有呼叫簽名的物件字面量來定義泛型函式。

相關文章