深入infer
infer的定义: infer表示在extends条件语句中以占位符出现,等到使用的时候才推断出来的数据类型
延迟推导、未推导时进行占位、等到真正推导成功后,它能准确的返回正确的类型
-
1、infer用在
extends条件语句中 -
2、表示在
extends条件语句中待推断的类型变量
场景:
用于提取函数类型的返回值类型
type ReturnType<T> = T extends (...args: any[]) => infer P ? P : any;
type Func = () => User;
type Test = ReturnType<Func>; // Test = User
用于提取构造函数中参数(实例)类型:
// 获取参数类型
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