TypeScript 基礎泛型
泛型允許建立“型別變數”,這些型別變數可用於建立不需顯式定義所用型別的類、函式和類型別名。
泛型使編寫可重用程式碼更加容易。
函式
函式中的泛型有助於建立更通用的方法,這些方法能更準確地表示所用和返回的型別。
示例
function createPair<S, T>(v1: S, v2: T): [S, T] {
return [v1, v2];
}
console.log(createPair<string, number>('hello', 42)); // ['hello', 42]
自己動手試一試 »
TypeScript 也可以從函式引數推斷泛型引數的型別。
Classes
泛型可用於建立通用的類,例如 Map。
示例
class NamedValue<T> {
private _value: T | undefined;
constructor(private name: string) {}
public setValue(value: T) {
this._value = value;
}
public getValue(): T | undefined {
return this._value;
}
public toString(): string {
return `${this.name}: ${this._value}`;
}
}
let value = new NamedValue<number>('myNumber');
value.setValue(10);
console.log(value.toString()); // myNumber: 10
自己動手試一試 »
TypeScript 也可以在建構函式引數中使用泛型引數時推斷其型別。
類型別名
類型別名中的泛型允許建立更具可重用性的型別。
示例
type Wrapped<T> = { value: T };
const wrappedValue: Wrapped<number> = { value: 10 };
使用以下語法,這同樣適用於介面: interface Wrapped<T> {
預設值
泛型可以被賦予預設值,如果沒有指定或推斷出其他值,則應用這些預設值。
示例
class NamedValue<T = string> {
private _value: T | undefined;
constructor(private name: string) {}
public setValue(value: T) {
this._value = value;
}
public getValue(): T | undefined {
return this._value;
}
public toString(): string {
return `${this.name}: ${this._value}`;
}
}
let value = new NamedValue('myNumber');
value.setValue('myValue');
console.log(value.toString()); // myNumber: myValue
extends
可以向泛型新增約束以限制允許的型別。約束使得在使用泛型型別時可以依賴於更具體的型別。
示例
function createLoggedPair<S extends string | number, T extends string | number>(v1: S, v2: T): [S, T] {
console.log(`creating pair: v1='${v1}', v2='${v2}'`);
return [v1, v2];
}
這可以與預設值結合使用。