考虑可重用性,使用泛型不仅能够支持当前的数据类型,同时也能支持未来的数据类型
类似类型的参数

一、泛型函数

  1. // 泛型函数
  2. function loggingIdentity<T>(arg: T[]): T[] { //
  3. console.log(arg.length); // Array has a .length, so no more error
  4. return arg;
  5. }

二、泛型类型

  1. interface GenericIdentityFn<T> {
  2. (arg: T): T;
  3. }
  4. function identity<T>(arg: T): T {
  5. return arg;
  6. }
  7. let myIdentity: GenericIdentityFn<number> = identity;

三、泛型类

  1. class GenericNumber<T> {
  2. zeroValue: T;
  3. add: (x: T, y: T) => T;
  4. }
  5. // 如果泛型为数字
  6. let myGenericNumber = new GenericNumber<number>();
  7. myGenericNumber.zeroValue = 0;
  8. myGenericNumber.add = function(x, y) { return x + y; };
  9. // 如果泛型为字符串
  10. let stringNumeric = new GenericNumber<string>();
  11. stringNumeric.zeroValue = "";
  12. stringNumeric.add = function(x, y) { return x + y; };
  13. console.log(stringNumeric.add(stringNumeric.zeroValue, "test"));

四、泛型约束

使用extends关键字约束

  1. interface Lengthwise {
  2. length: number;
  3. }
  4. function loggingIdentity<T extends Lengthwise>(arg: T): T {
  5. console.log(arg.length);
  6. return arg;
  7. }
  8. loggingIdentity(3); // 错误,3没有length
  9. loggingIdentity({length: 10, value: 3}); // 正确

1、在泛型约束中使用类型参数

  1. function getProperty<T, K extends keyof T>(obj: T, key: K) {
  2. return obj[key];
  3. }
  4. let x = { a: 1, b: 2, c: 3, d: 4 };
  5. getProperty(x, "a"); // 可以
  6. getProperty(x, "m"); // 错误: x中没有m属性

2、在泛型里使用类类型

  1. class BeeKeeper {
  2. hasMask: boolean;
  3. }
  4. class ZooKeeper {
  5. nametag: string;
  6. }
  7. class Animal {
  8. numLegs: number;
  9. }
  10. class Bee extends Animal {
  11. keeper: BeeKeeper;
  12. }
  13. class Lion extends Animal {
  14. keeper: ZooKeeper;
  15. }
  16. function createInstance<A extends Animal>(c: new () => A): A {
  17. return new c();
  18. }
  19. createInstance(Lion).keeper.nametag;
  20. createInstance(Bee).keeper.hasMask;