infer 表示在extends条件语句中待推断的类型变量
如何设计一个工具类型ReturnType

  1. interface User {
  2. id: number
  3. name: string
  4. form?: string
  5. }
  6. type Foo = () => User
  7. type R1 = ReturnType<Foo>
  8. // 所以需要用infer P 表示函数的返回类型
  9. type ReturnType<T> = T extends (...args: any[]) => infer P ? P : any;
  1. type ParamType<T> = T extends (param: infer P) => any ? P : T;
  2. // 如果T能赋值给 (params: infer P) => any, 则结果为(params: infer P) => any类型中的参数P
  3. // 否则返回T, infer P 表示待推断的函数参数

Typescript中内置了一个获取构造函数参数的工具类型 ConstructParameters, 提取构造函数中的参数类型

  1. class TestClass {
  2. constructor(public name: string, public age: number) {
  3. }
  4. }
  5. type RRR = ConstructorParameters<typeof TestClass> // // [string, number]
  6. type ConstructorParameter<T extends new (...args: any[]) => any> =
  7. T extends new (...args: infer P) => any ? P: never;
  8. type RRRR = ConstructorParameter<typeof TestClass>
  9. // new (...args: any[]) 指构造函数,因为构造函数可以被实例化
  10. // infer P 代表待推断的构造函数参数,如果接受的类型T是一个构造函数,
  11. // 那么返回构造函数的参数类型P, 否则什么也不返回,即never类型

infer的应用

  1. tuple 转成 union
  2. union 转成 intersection ```typescript type ElementOf = T extends Array ? E : never; type TTuple = [string, number]; type ToUnion = ElementOf; // [string, number] -> string | number

type UnionToIntersection = (U extends any ? (k: U) => void : never) extends ( k: infer I ) => void ? I : never;

type A = UnionToIntersection; // string | number -> string & number => never ```