泛型
原创...大约 1 分钟
泛型(Generics)是指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性
首先,我们来实现一个函数 createArray
function createArray(length: number, value: any): Array<any> {
let result = [];
for (let i = 0; i < length; i++) {
result[i] = value;
}
return result;
}
createArray(3, "x"); // ['x', 'x', 'x']
这段代码编译不会报错,但是一个显而易见的缺陷是,它并没有准确的定义返回值的类型
Array<any>
允许数组的每一项都为任意类型。但是我们预期的是,数组中每一项都应该是输入的 value 的类型
这时候,泛型就派上用场了
function createArray<T>(length: number, value: T): Array<T> {
let result: T[] = [];
for (let i = 0; i < length; i++) {
result[i] = value;
}
return result;
}
createArray<string>(3, "x"); // ['x', 'x', 'x']
多个类型参数
function swap<T, U>(v1: T, v2: U) {
console.log(v1, v2);
}
swap(10, 20);
泛型约束
在函数内部使用泛型变量的时候,由于事先不知道它是哪种类型,所以不能随意的操作它的属性或方法
function loggingLength<T>(arg: T) {
// Property 'length' does not exist on type 'T'
console.log(arg.length);
}
这时,我们可以对泛型进行约束,只允许这个函数传入那些包含 length
属性的变量。这就是泛型约束
interface Length {
length: number;
}
function loggingIdentity<T extends Length>(arg: T) {
console.log(arg.length);
}
loggingIdentity("Hello");
Powered by Waline v2.15.7