泛型
泛型(generic),即泛指的类型,是指在定义函数、类、接口时不预先指定具体类型,而是在使用时再指定类型。以尖括号 <>
定义,括号里面是泛型名称,一般使用<T>
表示泛型。
泛型函数
先看一个联合类型的例子,函数参数可以是字符串或者数字:
function foo(a: string | number) {}
foo('hello');
使用泛型后的例子如下,定义了一个<T>
泛型,在调用函数时要声明泛型的具体类型,TS 也会类型推断。
function foo<T>(a: T): T {
return a;
}
foo<string>('hello');
foo<number>(1);
foo(2); // 类型推断
定义type
或者interface
,可以传入泛型参数,达到类型复用的效果:
type PropsType<T> = {
[key: string]: T;
};
const obj: PropsType<number> = { a: 1, b: 2 };
泛型数组
有两种表示方式:Array<T>
和 T[]
function foo<T>(a: T[]) {}
foo<string>(['hello', 'world']);
function bar<T>(a: Array<T>) {}
bar<string>(['hello', 'world']);
泛型接口
定义一个接口来描述泛型函数的形状。
interface CreateArrayFun<T> {
(length: number, value: T): Array<T>;
}
let createArray: CreateArrayFun<any> = function <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']