泛型

  1. function bar(arg: any): any {
  2. return arg
  3. }
  4. // 类型变量,它是一种特殊的变量,只用于表示类型而不是值。
  5. function test<T>(arg: T): T {
  6. return arg
  7. }
  8. let str = test<string>('testing') //传入所有的参数,包含类型参数
  9. let num = test(12) //返回值是数字类型

泛型变量

  1. function fun<N>(arg: N): N {
  2. // arg.lenght 报错
  3. return arg
  4. }
  5. function func<T>(arg: Array<T>): Array<T> {
  6. console.log(arg.length);
  7. return arg
  8. }

泛型类型

  1. function func<T>(arg: T): T {
  2. return arg
  3. }
  4. let myFunc: <T>(arg: T) => T = func
  5. interface GenerFn<T> {
  6. (arg: T): T
  7. }
  8. let obj: GenerFn<number> = func

泛型约束

  1. interface Lengthwise {
  2. length: number;
  3. }
  4. function loggingIdentity<T extends Lengthwise>(arg: T): T {
  5. console.log(arg.length); // Now we know it has a .length property, so no more error
  6. return arg;
  7. }
  8. // loggingIdentity(3); 报错number doesn't have a .length property
  9. loggingIdentity({ length: 10, val: 3 });
  10. class BeeKeeper {
  11. hasMask: boolean;
  12. }
  13. class ZooKeeper {
  14. nametag: string;
  15. }
  16. class Animal {
  17. numLegs: number;
  18. }
  19. class Bee extends Animal {
  20. keeper: BeeKeeper;
  21. }
  22. class Lion extends Animal {
  23. keeper: ZooKeeper;
  24. }
  25. function createInstance<A extends Animal>(c: new () => A): A {
  26. return new c();
  27. }
  28. createInstance(Lion).keeper.nametag; // typechecks!
  29. createInstance(Bee).keeper.hasMask; // typechecks!