TS中的info用法

我们上篇文章中介绍了条件类型的基本语法是:

 T extends U ? X : Y;

如果占位符类型U是一个可以被分解成几个部分的类型,譬如数组类型,元组类型,函数类型,字符串字面量类型等。这时候可以通过infer来获取U类型中某个部分的类型。

infer语法的限制如下:

  • infer只能在条件类型的 extends 子句中使用
  • infer得到的类型只能在true语句中使用, 即X中使用

推断数组(或者元组)的类型

使用方法

type InferArray<T> = T extends (infer U)[] ? U : never;

(infer U)和平时常写的string[],number[]等等是不是很像?这里就是通过(infer U)来获取数组对应的类型。

案例

type I0 = InferArray<[number, string]>; // string | number
type I1 = InferArray<string[]>; // string
type I2 = InferArray<number[]>; // number

案例

type Infer<T> = T extends (infer U) ? U : never;
type I3 = Infer<number>; // number

推断数组(或者元组)第一个元素的类型
使用方法
type InferFirst<T extends unknown[]> = T extends [infer P, …infer _] ? P : never
复制代码

[infer P, … infer _]中infer P获取的是第一个元素的类型,而…infer 获取的是数组其他剩余元素的数组类型;
特别说明下,我们例子汇总不需要使用其他元素的类型,所以用

案例
type I3 = InferFirst<[3, 2, 1]>; // 3
复制代码
推断数组(或者元组)最后一个元素的类型
使用方法
type InferLast<T extends unknown[]> = T extends [… infer _, infer Last] ? Last : never;
复制代码

这个和推断数组第一个元素的类型类似,…infer _获取的是最后一个元素之前的所有元素类型,infer Last获取的是最后一个元素的类型。

案例
type I4 = InferLast<[3, 2, 1]>; // 1
复制代码
推断函数类型的参数
使用方法
type InferParameters = T extends (…args: infer R) => any ? R : never;
复制代码

…args 代表的是函数参数组成的元组, infer R代表的就是推断出来的这个函数参数组成的元组的类型。

案例
type I5 = InferParameters<((arg1: string, arg2: number) => void)>; // [string, number]
复制代码
推断函数类型的返回值
使用方法
type InferReturnType = T extends (…args: any) => infer R ? R : never;
复制代码

和前面的推断函数类型的参数类似,=> 后面的infer R代表的就是推断出来的函数的返回值类型。

案例
type I6 = InferReturnType<() => string>; // string
复制代码
推断Promise成功值的类型
使用方法
type InferPromise = T extends Promise ? U : never;

复制代码
案例
type I7 = InferPromise<Promise>; // string
复制代码
推断字符串字面量类型的第一个字符对应的字面量类型
使用方法
type InferString = T extends ${infer First}${infer _} ? First : [];
复制代码
案例
type I8 = InferString<“Johnny”>; // J

作者:chonglingliu
链接:https://juejin.cn/post/7110582223052472328
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

勇敢*牛牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值