泛型是指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性。
function arr(arr: number[]): void {for (var item of arr) {console.log(item);}}arr([1, 2, 3, 4]);
使用 any 也可以通过编译,但是无法准确定义返回值的类型,这个时候就可以使用泛型函数
泛型函数
在函数名后加上 <T> (也可以是其他别的字母),其中 T 用来指代输入的类型,在函数内部就可以使用这个 T 类型。
function echo<T>(arg: T): T {return arg;}console.log(echo(true));
多个类型参数
function swap<T, U>(value: [T, U]): [U, T] {return [value[1], value[0]];}swap([1, "one"]); // [ 'one', 1 ]
泛型接口
interface Iadd<T> {(x: T, y: T): T;}var add: Iadd<number> = function (x: number, y: number): number {return x + y;};
约束泛型
在函数内部使用泛型变量的时候,由于事先不知道它是哪种类型,所以不能随意的操作它的属性或方法
interface IWithLength {length: number;}function echoWidthLength<T extends IWithLength>(arg: T): T {console.log(arg.length);return arg;}const str = echoWidthLength("str");const obj = echoWidthLength({ length: 10 });const arr = echoWidthLength([1, 2, 3]);
