泛型是指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性。

  1. function arr(arr: number[]): void {
  2. for (var item of arr) {
  3. console.log(item);
  4. }
  5. }
  6. arr([1, 2, 3, 4]);

使用 any 也可以通过编译,但是无法准确定义返回值的类型,这个时候就可以使用泛型函数

泛型函数

在函数名后加上 <T> (也可以是其他别的字母),其中 T 用来指代输入的类型,在函数内部就可以使用这个 T 类型。

  1. function echo<T>(arg: T): T {
  2. return arg;
  3. }
  4. console.log(echo(true));

多个类型参数

  1. function swap<T, U>(value: [T, U]): [U, T] {
  2. return [value[1], value[0]];
  3. }
  4. swap([1, "one"]); // [ 'one', 1 ]

泛型接口

  1. interface Iadd<T> {
  2. (x: T, y: T): T;
  3. }
  4. var add: Iadd<number> = function (x: number, y: number): number {
  5. return x + y;
  6. };

约束泛型

在函数内部使用泛型变量的时候,由于事先不知道它是哪种类型,所以不能随意的操作它的属性或方法

  1. interface IWithLength {
  2. length: number;
  3. }
  4. function echoWidthLength<T extends IWithLength>(arg: T): T {
  5. console.log(arg.length);
  6. return arg;
  7. }
  8. const str = echoWidthLength("str");
  9. const obj = echoWidthLength({ length: 10 });
  10. const arr = echoWidthLength([1, 2, 3]);