设计泛型的关键⽬的是在成员之间提供有意义的约束,这些成员可以是:类的实例成员、类的⽅法、函
数参数和函数返回值。
泛型(Generics)是允许同⼀个函数接受不同类型参数的⼀种模板
相⽐于使⽤ any 类型,使⽤泛型来创建可复⽤的组件要更好,因为泛型会保留参数类型。
**

image.png
image.png

  1. console.log(identity<Number,String>(68, 'hello')); // 为类型变量显式设定值
  2. ==== 等价于
  3. console.log(identity(68, 'hello'));// 省略尖括号,利用编译器自动选择这些类型
  4. // 编译器⾜够聪明,能够知道我们的参数类型,并将它们赋值给 T 和 U,不需要开发⼈员显式指定它们

为什么需要泛型?
==>
比如定义一个函数,入参为number,但是现在想把这个函数扩展为适合任一类型的
如果把入参改为any就会出去校验的功能,此时泛型T就适合登场了

泛型接口

  1. interface GenericIdentityFn<T> {
  2. (arg: T): T
  3. }

泛型类

  1. class GenericNumber<T> {
  2. zeroValue: T;
  3. add: (x: T, y: T) => T;
  4. }
  5. let myGenericNumber = new GenericNumber<number>();
  6. myGenericNumber.zeroValue = 0;
  7. myGenericNumber.add = (x, y) => x + y;