泛型是指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性。
定义函数时的使用
function createArray<T>(length: number, value: T): Array<T> {
let result: T[] = [];
for (let i = 0; i < length; i++) {
result[i] = value;
}
return result;
}
在函数名后添加了 <T>,其中 T 用来指代任意输入的类型,在后面的输入 value: T 和输出 Array<T> 中即可使用了
接着在调用的时候,可以指定它具体的类型为 string。当然,也可以不手动指定,而让类型推论自动推算出来
createArray<string>(3, 'x'); // ['x', 'x', 'x']
也可以一次定义多个泛型参数
function swap<T,U>(tuple: [T, U]): [U, T] {
return [tuple[1], tuple[0]];
}
swap([7, 'seven']); // ['seven', 7]
也可以对泛型进行约束
interface Lengthwise {
length: number;
}
// 传入的泛型至少包含Lengthwise里面的属性
function loggingIdentity<T extends Lengthwise>(arg: T): T {
console.log(arg.length);
return arg;
}
泛型接口
interface CommonResponse<T> {
status: number;
errMsg: string;
ok: boolean;
data: T ;
}
在使用泛型接口的时候,需要定义泛型的类型
泛型类
class GenericNumber<T> {
zeroValue: T;
add: (x: T, y: T) => T;
}
也可以为泛型指定默认值
function createArray<T = string>(length: number, value: T): Array<T> {
let result: T[] = [];
for (let i = 0; i < length; i++) {
result[i] = value;
}
return result;
}