快速掌握 TypeScript 新语法:Infer Extends

网站建设3年前发布
23 0 0

2023030610183018ee2b670bc7870b5e1806582f1d313317bbb9847,我们知道,TypeScript 支持 infer 来提取类型的一部分,通过模式匹配的方式。,比如元组类型提取最后一个元素的类型:,20230306101831055beb48101d83884a388768650d89dbf0d144463,比如函数提取返回值类型:,2023030610183268f11a6572ad1e834d1520be9019c853ced934540,比如字符串提取一部分,然后替换:,202303061020061121af695f492d533c5991a4d8209c17234da9469,模式匹配就是通过一个类型匹配一个模式类型,需要提取的部分通过 infer 声明一个局部变量,这样就能从局部变量里拿到提取的类型。,infer 的模式匹配用法还是挺好理解的。,但是 infer 有一个问题,比如这样:,2023030610183303767d205f73f5f24fa104b4fdbfbaecaddee7442,从 string 数组中提取的元素,默认会推导为 unknown 类型,这就导致了不能直接把它当 string 用:,20230306102007021e9b337c102f77407238924a00f57acc02fa951,那怎么办呢?,之前的处理方式是这样的:,2023030610183332c52512370a6a50d74036409198852047bcf0274,加一层判断,这样 Last 就推导为 string 类型了。,或者也可以和 string 取交叉类型:,202303061018341381593542ed3c0ea0b717bf1f7783338695e7657,这样也可以作为 string 来用。,但是我们明明知道这里就是 string,却还需要 & string 或者 xxx extends string 来转换一次,这也太麻烦了。,TS 也知道有这个问题,所以在 4.7 就引入了新语法:infer extends。,现在我们可以这样写:,20230306101835f2ee15d2757d84a3a14399e430bc3874df78be840,infer 的时候加上 extends 来约束推导的类型,这样推导出的就不再是 unknown 了,而是约束的类型。,这个语法是 TS 4.7 引入的,在 4.8 又完善了一下。,比如这样一个类型:,在 4.7 的时候推导结果是这样:,2023030610183577c516c835835c439f66134134b1f0f8a11ed7508,而 4.8 就是这样了:,202303061018360639b581758c137a7a496083c1773f3666cd31506,也就是说 4.7 的时候推导出的就是 extends 约束的类型,但是 4.8 的时候,如果是基础类型,会推导出字面量类型。,有了这个语法之后,除了能简化类型编程的逻辑之外,也能实现一些之前实现不了的功能:,比如提取枚举的值的类型:,我们都是这样写:,202303061020071770af39830af37ea1e69503808e5f3e9c2eb8978,但是有的值明明是数字,却被作为了字符串,所以要再处理一下,转换成数字类型,这时候就可以用 infer extends 了:,做完 string 到 number 的转换,就拿到了我们想要的结果:,20230306101837e6c6d724270da034be2275c78f292fb3359f01180,这就是 infer extends 的第二个作用。,处理 string 转 number 之外,也可以转 boolean、null 等类型:,20230306101838f425f4c503b7d95d8c7677c4b6bb04df21bde861920230306101839a1a490a38df9e41a48098329eada29152e8e12965,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,不但能简化类型编程,还能实现一些之前很难实现的类型转换。

© 版权声明

相关文章