boxboxs
技术

ts中的infer

浏览 22最近编辑于
ts中的infer

为什么需要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 登录评论

暂无评论,成为第一个评论者!