# 泛型
泛型(Generics)是指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性。
# 简单的例子
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(3, "x"); // ['x', 'x', 'x']
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
上例中,我们在函数名后添加了 <T>
,其中 T
(声明)用来指代任意输入的类型,在后面的输入 value: T
(赋值)和输出 Array<T>
(使用)中即可使用了。
# 多个类型参数
function swap<T, U>(tuple: [T, U]): [U, T] {
return [tuple[1], tuple[0]];
}
swap([7, "seven"]); // ['seven', 7]
1
2
3
4
5
2
3
4
5
# 泛型约束
可以对泛型进行约束,只允许这个函数传入那些包含 length
属性的变量:
interface Lengthwise {
length: number;
}
function loggingIdentity<T extends Lengthwise>(arg: T): T {
console.log(arg.length);
return arg;
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
多个类型参数之间也可以互相约束:
function copyFields<T extends U, U>(target: T, source: U): T {
for (let id in source) {
target[id] = (<T>source)[id];
}
return target;
}
let x = { a: 1, b: 2, c: 3, d: 4 };
copyFields(x, { b: 10, d: 20 });
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
上例中,我们使用了两个类型参数,其中要求 T 继承 U,这样就保证了 U 上不会出现 T 中不存在的字段。