TypeScript新语法之infer extends示例详解

作者:zxg_神说要有光 时间:2024-03-13 20:42:27 

我们知道,TypeScript 支持 infer 来提取类型的一部分,通过模式匹配的方式。

模式匹配

比如元组类型提取最后一个元素的类型:

type Last<Arr extends unknown[]> =
   Arr extends [...infer rest,infer Ele]
       ? Ele
       : never;

TypeScript新语法之infer extends示例详解

比如函数提取返回值类型:

type GetReturnType<Func extends Function> =
   Func extends (...args: any[]) => infer ReturnType
       ? ReturnType
       : never;

TypeScript新语法之infer extends示例详解

比如字符串提取一部分,然后替换:

type ReplaceStr<
   Str extends string,
   From extends string,
   To extends string
> = Str extends `${infer Prefix}${From}${infer Suffix}`
       ? `${Prefix}${To}${Suffix}` : Str;

TypeScript新语法之infer extends示例详解

模式匹配就是通过一个类型匹配一个模式类型,需要提取的部分通过 infer 声明一个局部变量,这样就能从局部变量里拿到提取的类型。

infer 的模式匹配用法还是挺好理解的。

但是 infer 有一个问题,比如这样:

TypeScript新语法之infer extends示例详解

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

TypeScript新语法之infer extends示例详解

那怎么办呢?

之前的处理方式是这样的:

TypeScript新语法之infer extends示例详解

加一层判断,这样 Last 就推导为 string 类型了。

或者也可以和 string 取交叉类型:

TypeScript新语法之infer extends示例详解

这样也可以作为 string 来用。

但是我们明明知道这里就是 string,却还需要 & string 或者 xxx extends string 来转换一次,这也太麻烦了。

TS 也知道有这个问题,所以在 4.7 就引入了新语法:infer extends。

现在我们可以这样写:

TypeScript新语法之infer extends示例详解

infer 的时候加上 extends 来约束推导的类型,这样推导出的就不再是 unknown 了,而是约束的类型。

试一下

这个语法是 TS 4.7 引入的,在 4.8 又完善了一下。

比如这样一个类型:

type NumInfer<Str> =
   Str extends `${infer Num extends number}`
       ? Num
       : never;

在 4.7 的时候推导结果是这样:

TypeScript新语法之infer extends示例详解

而 4.8 就是这样了:

TypeScript新语法之infer extends示例详解

也就是说 4.7 的时候推导出的就是 extends 约束的类型,但是 4.8 的时候,如果是基础类型,会推导出字面量类型。

有了这个语法之后,除了能简化类型编程的逻辑之外,也能实现一些之前实现不了的功能:

提取枚举的值的类型

enum Code {
   a = 111,
   b = 222,
   c = "abc"
}

我们都是这样写:

TypeScript新语法之infer extends示例详解

但是有的值明明是数字,却被作为了字符串,所以要再处理一下,转换成数字类型,这时候就可以用 infer extends 了:

type StrToNum<Str> =
 Str extends `${infer Num extends number}`
   ? Num
   : Str

做完 string 到 number 的转换,就拿到了我们想要的结果:

TypeScript新语法之infer extends示例详解

这就是 infer extends 的第二个作用。

处理 string 转 number 之外,也可以转 boolean、null 等类型:

TypeScript新语法之infer extends示例详解

TypeScript新语法之infer extends示例详解

试一下

来源:https://juejin.cn/post/7133438765317488677

标签:TypeScript,语法,infer,extends
0
投稿

猜你喜欢

  • Vue状态管理库Pinia详细介绍

    2024-05-09 15:11:43
  • Python使用sax模块解析XML文件示例

    2021-11-28 15:31:39
  • 利用Python绘制虎年烟花秀

    2022-10-08 06:03:49
  • 理解Python数据离散化手写if-elif语句与pandas中cut()方法实现

    2023-02-24 10:33:33
  • python anaconda 安装 环境变量 升级 以及特殊库安装的方法

    2022-11-05 01:56:24
  • Mysql查询表中最小可用id值的方法

    2024-01-27 02:31:29
  • 详解Vue.js 可拖放文本框组件的使用

    2024-04-27 15:47:22
  • 泛域名设置问题

    2008-03-25 10:03:00
  • python实现超时退出的三种方式总结

    2023-07-22 17:56:34
  • 解读sqlalchemy的常用数据类型有哪些

    2022-02-19 19:42:17
  • sqlserver之datepart和datediff应用查找当天上午和下午的数据

    2024-01-14 22:27:42
  • sql注入数据库原理详情介绍

    2024-01-15 17:05:12
  • python 计算一个字符串中所有数字的和实例

    2022-07-19 01:42:33
  • Python自定义主从分布式架构实例分析

    2022-09-24 01:28:29
  • Python爬虫实战之爬取京东商品数据并实实现数据可视化

    2023-11-02 18:42:38
  • JavaScript也谈内存优化

    2024-02-25 16:33:17
  • 《写给大家看的设计书》阅读笔记之亲密性原则

    2009-07-08 20:02:00
  • PyQt5 在QListWidget自定义Item的操作

    2023-07-05 16:35:49
  • pytest官方文档解读之安装和使用插件的方法

    2022-11-25 23:05:38
  • uni-app使用countdown插件实现倒计时

    2024-05-10 14:15:14
  • asp之家 网络编程 m.aspxhome.com