无法创建泛型枚举和泛型命名空间

泛型函数

  1. function identity<T>(arg: T): T {
  2. return arg;
  3. }
  4. // 使用方式
  5. let output = identity<string>("myString"); // type of output will be 'string'
  6. let output = identity("myString"); // type of output will be 'string'

多个类型参数

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

泛型变量

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

你可以这样理解loggingIdentity的类型:泛型函数loggingIdentity,接收类型参数T和参数arg,它是个元素类型是T的数组,并返回元素类型是T的数组。 如果我们传入数字数组,将返回一个数字数组,因为此时T的的类型为number。 这可以让我们把泛型变量T当做类型的一部分使用,而不是整个类型,增加了灵活性

泛型接口

  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. 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. // 我们需要传入符合约束类型的值,必须包含必须的属性:
  9. loggingIdentity({length: 10, value: 3});

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

可以声明一个类型参数,且被另一个类型参数所约束

  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"); // okay
  6. getProperty(x, "m"); // error: Argument of type 'm' isn't assignable to 'a' | 'b' | 'c' | 'd'.

泛型参数的默认类型

在 TypeScript 2.3 以后,我们可以为泛型中的类型参数指定默认类型。当使用泛型时没有在代码中直接指定类型参数,从实际值参数中也无法推测出时,这个默认类型就会起作用

  1. declare function create<T extends HTMLElement = HTMLDivElement, U = T[]>(
  2. element?: T,
  3. children?: U
  4. ): Container<T, U>;