快速掌握 TypeScript 新语法:Infer Extends

我们知道,快速TypeScript 支持 infer 来提取类型的掌握一部分,通过模式匹配的新语方式。
比如元组类型提取最后一个元素的快速类型:
type Last =
Arr extends [...infer rest,infer Ele]
? Ele
: never;
比如函数提取返回值类型:
type GetReturnType
Func extends (...args: any[]) => infer ReturnType
? ReturnType
: never;
比如字符串提取一部分,然后替换:
type ReplaceStr<
Str extends string,掌握
From extends string,
To extends string
> = Str extends `${infer Prefix}${From}${infer Suffix}`
? `${Prefix}${To}${Suffix}` : Str;
模式匹配就是通过一个类型匹配一个模式类型,需要提取的新语部分通过 infer 声明一个局部变量,这样就能从局部变量里拿到提取的快速类型。
infer 的掌握模式匹配用法还是挺好理解的。
但是新语 infer 有一个问题,比如这样:

从 string 数组中提取的快速元素,默认会推导为 unknown 类型,掌握这就导致了不能直接把它当 string 用:

那怎么办呢?新语
之前的处理方式是这样的:

加一层判断,这样 Last 就推导为 string 类型了。快速
或者也可以和 string 取交叉类型:

这样也可以作为 string 来用。掌握
但是新语我们明明知道这里就是 string,却还需要 & string 或者 xxx extends string 来转换一次,这也太麻烦了。
TS 也知道有这个问题,源码下载所以在 4.7 就引入了新语法:infer extends。
现在我们可以这样写:

infer 的时候加上 extends 来约束推导的类型,这样推导出的就不再是 unknown 了,而是约束的类型。
这个语法是 TS 4.7 引入的,在 4.8 又完善了一下。
比如这样一个类型:
type NumInfer
Str extends `${infer Num extends number}`
? Num
: never;在 4.7 的时候推导结果是这样:

而 4.8 就是这样了:

也就是说 4.7 的时候推导出的就是 extends 约束的类型,但是 4.8 的时候,如果是基础类型,会推导出字面量类型。
有了这个语法之后,除了能简化类型编程的逻辑之外,也能实现一些之前实现不了的网站模板功能:
比如提取枚举的值的类型:
enum Code {
a = 111,
b = 222,
c = "abc"
}我们都是这样写:

但是有的值明明是数字,却被作为了字符串,所以要再处理一下,转换成数字类型,这时候就可以用 infer extends 了:
type StrToNum
Str extends `${infer Num extends number}`
? Num
: Str做完 string 到 number 的转换,就拿到了我们想要的结果:

这就是 infer extends 的第二个作用。
处理 string 转 number 之外,也可以转 boolean、null 等类型:


Typescript 支持 infer 类型,可以通过模式匹配的方式,提取一部分类型返回。
但是 infer 提取出的类型是 unknown,后面用的时候需要类似和 string 取交叉类型,或者 xxx extends string 这样的方式来转换成别的类型来用。这样比较麻烦。
所以 TS 4.7 实现了 infer extends 的服务器租用语法,可以指定推导出的类型,这样简化了类型编程。
而且,infer extends 还可以用来做类型转换,比如 string 转 number、转 boolean 等。
要注意的是,4.7 的时候,推导出的只是 extends 约束的类型,比如 number、boolean,但是 4.8 就能推导出字面量类型了,比如 1、2、true、false 这种。
有了 infer extends,不但能简化类型编程,还能实现一些之前很难实现的类型转换。
相关文章
索尼MDREX250AP耳机的全面评测(探索音质卓越、舒适度卓越和设计精美的索尼MDREX250AP耳机)
摘要:索尼MDREX250AP耳机是一款备受好评的入耳式耳机,其音质出众、舒适度极佳和外观设计精美。本文将对这款耳机进行全面评测,从音质、舒适度、外观设计、耐用性等多个方面进行详细介绍。...2025-11-05
用户行为类数据的特点在于用户数量庞大,但每个用户的行为数量较小,针对用户行为的计算较为复杂,用户之间的关联计算相对较少。用户数量庞大。通话记录中的电话号码、访问日志中的用户编号、账户信息中的银行账户、2025-11-05
做web自动化测试首先是测试环境搭建,关键在于如何安装selenium模块到python环境。很多人会想这个安装很简单啊,直接一条语句就可以啦。现实与理想之间总是有差距的。作为新手第一次安装时,可能会2025-11-05
何谓数据异构,上周交易部门商品的同事过来做分享,又看到这个词,他的PPT里面是 数据库异构。其实我们以前做的事情,也是可以称之为数据异构。比如我们将DB里面的数据持久化到Redis里面去,就是一种数据2025-11-05打造网红电脑钟表的制作教程(用创意与技术,打造属于自己的网红电脑钟表)
摘要:在如今这个数字化时代,电脑和钟表都成为了人们生活中不可或缺的物品。为何不将二者结合起来,打造一个独一无二的网红电脑钟表呢?本文将为大家详细介绍如何制作属于自己的网红电脑钟表,通过创...2025-11-05
接上文《性能优化那些事儿(一)》『不管项目大小,一旦上线,或多或少都会遇到性能问题』性能问题就像是魔咒一般藏绕着我们。性能优化应该什么时候开始有些性能问题是随着时间的积累慢慢产生的,比如系统一2025-11-05

最新评论