跳到主要内容

深入infer

infer的定义: infer表示在extends条件语句中以占位符出现,等到使用的时候才推断出来的数据类型

延迟推导、未推导时进行占位、等到真正推导成功后,它能准确的返回正确的类型

  • 1、infer用在extends 条件语句中

  • 2、表示在 extends 条件语句中待推断的类型变量

场景:​

用于提取函数类型的返回值类型​

tsx
type ReturnType<T> = T extends (...args: any[]) => infer P ? P : any;
type Func = () => User;
type Test = ReturnType<Func>; // Test = User

用于提取构造函数中参数(实例)类型:​

tsx
// 获取参数类型
type ConstructorParameters<T extends new (...args: any[]) => any> = T extends new (...args: infer P) => any
? P
: never;

// 获取实例类型
type InstanceType<T extends new (...args: any[]) => any> = T extends new (...args: any[]) => infer R ? R : any;

class TestClass {
constructor(public name: string, public age: number) {}
}

type Params = ConstructorParameters<typeof TestClass>; // [string, number]

type Instance = InstanceType<typeof TestClass>; // TestClass