-
使用了類型變量的對象叫做泛型厅须,如函數(shù)泛型
function identity<T>(arg: T): T { return arg; }
T是一個類型變量阅茶,類型變量只用于儲存用戶傳入的類型
-
泛型函數(shù)可通過<>尖括號顯式傳入類型參數(shù)劲件,但一般情況下可讓編譯器自動判斷類型
let output = identity<string>("myString"); // 顯式傳入類型 let output = identity("myString"); // 自動判斷類型
數(shù)組泛型的使用也類似
function loggingIdentity<T>(arg: T[]): T[] { // 等同于function loggingIdentity<T>(arg: Array<T>): Array<T> { console.log(arg.length); // Array has a .length, so no more error return arg; }
泛型類型
-
與非泛型函數(shù)類型類似
function identity<T>(arg: T): T { return arg; } let myIdentity: <U>(arg: U) => U = identity;
-
還可以使用帶有調(diào)用簽名的對象字面量來定義泛型函數(shù)
function identity<T>(arg: T): T { return arg; } let myIdentity: {<T>(arg: T): T} = identity;
-
泛型接口
interface GenericIdentityFn { <T>(arg: T): T; } function identity<T>(arg: T): T { return arg; } let myIdentity: GenericIdentityFn = identity;
也可以將泛型參數(shù)當(dāng)做接口的參數(shù)
interface GenericIdentityFn<T> { (arg: T): T; } function identity<T>(arg: T): T { return arg; } let myIdentity: GenericIdentityFn<number> = identity;
-
泛型類
class GenericNumber<T> { zeroValue: T; add: (x: T, y: T) => T; } let myGenericNumber = new GenericNumber<number>();
泛型約束
-
可以通過接口定義泛型參數(shù)的約束條件
interface Lengthwise { length: number; } function loggingIdentity<T extends Lengthwise>(arg: T): T { console.log(arg.length); // Now we know it has a .length property, so no more error return arg; }
-
還可以各種套娃
// 在泛型約束中使用類型參數(shù) function getProperty(obj: T, key: K) { return obj[key]; } let x = { a: 1, b: 2, c: 3, d: 4 }; getProperty(x, "a"); // okay getProperty(x, "m"); // error: Argument of type 'm' isn't assignable to 'a' | 'b' | 'c' | 'd'. // 在泛型里使用類類型 function create<T>(c: {new(): T; }): T { return new c(); }