infer 表示在extends条件语句中待推断的类型变量
如何设计一个工具类型ReturnType
interface User {
id: number
name: string
form?: string
}
type Foo = () => User
type R1 = ReturnType<Foo>
// 所以需要用infer P 表示函数的返回类型
type ReturnType<T> = T extends (...args: any[]) => infer P ? P : any;
type ParamType<T> = T extends (param: infer P) => any ? P : T;
// 如果T能赋值给 (params: infer P) => any, 则结果为(params: infer P) => any类型中的参数P
// 否则返回T, infer P 表示待推断的函数参数
Typescript中内置了一个获取构造函数参数的工具类型 ConstructParameters
class TestClass {
constructor(public name: string, public age: number) {
}
}
type RRR = ConstructorParameters<typeof TestClass> // // [string, number]
type ConstructorParameter<T extends new (...args: any[]) => any> =
T extends new (...args: infer P) => any ? P: never;
type RRRR = ConstructorParameter<typeof TestClass>
// new (...args: any[]) 指构造函数,因为构造函数可以被实例化
// infer P 代表待推断的构造函数参数,如果接受的类型T是一个构造函数,
// 那么返回构造函数的参数类型P, 否则什么也不返回,即never类型
infer的应用
- tuple 转成 union
- 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