Typescript — infer
infer
这篇讲的很详细可以参考一波Using TypeScript infer Like a Pro | by Bytefer | Level Up Coding
介绍
infer
最早出现在此 PR 中,表示在 extends
条件语句中待推断的类型变量。
简单示例如下:
type ParamType<T> = T extends (arg: infer P) => any ? P : T;
在这个条件语句 T extends (arg: infer P) => any ? P : T
中,infer P
表示待推断的函数参数。
整句表示为:如果 T
能赋值给 (arg: infer P) => any
,则结果是 (arg: infer P) => any
类型中的参数 P
,否则返回为 T
。
interface User {
name: string;
age: number;
}
type Func = (user: User) => void;
type Param = ParamType<Func>; // Param = User
type AA = ParamType<string>; // string
内置类型
在 2.8 版本中,TypeScript 内置了一些与 infer
有关的映射类型:
- 用于提取函数类型的返回值类型:
type ReturnType<T> = T extends (...args: any[]) => infer P ? P : any;
相比于文章开始给出的示例,ReturnType<T>
只是将 infer P
从参数位置移动到返回值位置,因此此时 P
即是表示待推断的返回值类型。
type Func = () => User;
type Test = ReturnType<Func>; // Test = User
- 用于提取构造函数中参数(实例)类型:
一个构造函数可以使用new
来实例化,因此它的类型通常表示如下:
type Constructor = new (...args: any[]) => any;
当 infer
用于构造函数类型中,可用于参数位置 new (...args: infer P) => any;
和返回值位置 new (...args: any[]) => infer P;
。
因此就内置如下两个映射类型:
// 获取参数类型
type ConstructorParameters&l