ts中的infer
浏览 22最近编辑于
为什么需要infer
有时候我们需要:从函数类型里拿到返回值类型、数组里面拿到元素的类型、Promise中拿到内部的类型等。他们有一个共同点就是:不是定义一个新的类型,而是从已有类型中提取一部分类型。除了获取数据元素的类型
type Element<T extends any[]> = T[number] type A = ElementType<string[]>; // string type B = ElementType<number[]>; // number
其他两个需求,是很难做到”解构“出来的。所以infer出现了。
什么是infer
infer从上面,我们可以理解为:infer是Typescript条件类型中的关键字,用来在类型匹配时临时声明一个类型变量,并把这个位置的类型推断出来。例如,我们用infer来解决获取函数返回值问题
type GetReturnType<T> = T extends (...args: any[]) => infer R ? R : never
思路如下:
- infer使用在条件类型中,T extends U ? X : Y,如果T满足约束U,则结果是X,否则为Y。所以U就是(...args: any[]) => infer R, X就是R,Y是never。其实就是判断是否满足函数类型,且有返回值
- 如果GetReturnType传入的类型参数T满足约束,则将函数类型返回值提取出来,使用infer”定义“为R,将R返回,不满足则返回never
所以如果没有infer 只能判断是否满足约束,infer的”解构“”定义“功能,才能从结构中拿出一部分类型。
常用需求
- 提取函数的参数类型
- 提取数组元素类型
- 提取promise的内部类型
我们都可以套用公式: 参数是否满足提取类型的整体结构 ? 返回某个被定义部分结构 : 兜底处理
type GetParameters<T> = T extends (...args: infer P) => any ? P : T type GetElement<T> = T extends (infer E)[] ? U : T type UnwrapPromise<T> = T extends Promise<infer U> ? U : T
很多内置工具类型都依赖infer
- Parameters<T> 提取函数参数元组
- ReturnType<T> 提取函数返回值类型
- ConstructorParameters<T> 提取构造函数参数元组
- InstanceType<T> 提取构造函数实例类型
评论 (0)
为了减少垃圾评论,请先使用 GitHub 登录后再发表评论。
使用 GitHub 登录评论暂无评论,成为第一个评论者!