来了解一下TS中的infer吧

来了解一下TS中的infer吧

在 TypeScript 中,infer 类型是一个非常强大且有用的特性。

infer 通常用于条件类型中,它允许我们在类型操作中进行类型推断。简单来说,就是能够从已有的类型中提取出一部分类型信息。

基本用法

infer 关键字只能在条件类型中使用,通常与泛型和 extends 关键字一起使用。它的语法如下:

typescript 复制代码
type Case<T> = T extends infer U ? U : never;

这段代码定义了一个类型别名Case<T>,它尝试推断泛型参数T的实际类型。如果T可以被推断为某个具体的类型U,那么Case<T>的类型就是U;如果T不能被推断为任何类型(比如T是一个具体值而不是类型),那么Case<T>的类型就是never。
注意:这个类型变量(infer U)只能在true的分支中使用。

懵逼了千万别怕,看了下面两个例子就秒懂了~

举个例子

案例一:

结合上述代码

type Case = T extends infer U ? U : never;

如果你使用Case<number>,那么T会被推断为number,所以Case<number>的类型就是number。

解释

  1. T extends infer U ? U : never是一个条件类型表达式。条件类型允许你基于一个类型检查的结果来选择两种类型之一。
  2. infer U是类型推断的关键字。它用于在条件类型中声明一个待推断的类型变量U。这里的infer关键字告诉TypeScript尝试推断T的实际类型,并将其赋值给U。 查的结果来选择返回的类型。如果T可以被推断为某个类型U,则返回U;否则,返回never类型。

现在,让我们具体看看Case<number>的情况:

  • 当你使用Case<number>时,T被指定为number。
  • 条件类型T extends infer U检查number是否可以被推断为某个类型U。在这个情况下,number本身就是一个类型,所以它可以被推断。
  • 由于number可以被推断,因此U被推断为number。

所以可以看到实际上T extends infer U 中,U的类型是依靠T的类型获取的

因此如果你使用Case<42>,由于42是一个具体的值而不是类型,所以Case<42>的类型就是never。

案例二:

问题 :给定类型别名type,要求获取HD类型中属性的类型?

ini 复制代码
type HD = { name: string, age: number }
type valueType = AttrType<HD>

也就是其中name,age的类型:string ,number

利用infer X定义变量

r 复制代码
type AttrType<T> = T extends { name: infer M, age: infer M } ? M : T;

这里infer M会尝试推断泛型参数T的实际类型来推断M变量的类型

  • 条件类型 T extends { name: infer M, age: infer M } ? M : T; 检查 T 是否可以被赋值给一个对象,该对象有两个属性 name 和 age,它们都推断为同一个类型 M。
  • 如果 T 满足这个条件(即 T 是一个对象,且 name 和 age 属性的类型相同),那么 AttrType<T> 将被推断为该共同的类型 M。
  • 如果 T 不满足这个条件(即 T 不是一个对象,或者 name 和 age 属性的类型不相同),那么 AttrType<T> 将返回 T 本身。

小结

再用白话小结一下:

  1. infer X 就相当于声明了一个变量,这个变量X随后可以使用,甚至和我们常见的for循环中的let i很像,只是一个具体值未知形式的表示而已。

  2. 而这里X值的具体值又需要结合extend T,通过T的类型获取。

相关推荐
deli0078 分钟前
从一句反馈到一次升级:Mystudy 的自进化实践
前端
FungLeo43 分钟前
成为全栈·Vue 管理后台篇·用 fetch 建一层可控的请求内核
前端·javascript·vue.js·http·fetch·formdata·接口封装
FungLeo3 小时前
成为全栈·Vue 管理后台篇·Vue Router如何守住多角色后台边界
前端·javascript·vue.js·rbac·vue router·路由守卫·前端权限
FungLeo3 小时前
成为全栈·Vue 管理后台篇·分页只显示第一页:从接口total 定位到前端修复
前端·vue.js·状态模式·分页·naive ui·服务端分页·前端问题排查
ZhengEnCi3 小时前
苹果滑动为什么有「肉感」:橡皮筋越界阻尼与弹簧动画的物理原理
前端
Moment3 小时前
不会后期的我,发现了一个开源胶片神器😍😍😍
前端·后端·开源
L1mbo3 小时前
Lite模式 缓解微信开发者工具卡顿,附 uni-app 实践方案
前端·微信小程序
FungLeo3 小时前
成为全栈·Vue管理后台篇·仪表盘不是几张卡片:组合统计接口与角色视图
前端·javascript·vue.js·rbac·仪表盘·管理后台·tanstack query
SameX4 小时前
HarmonyOS 做桌面卡片 onAddForm 要同步返回但数据在数据库里的解法
前端
deli0074 小时前
手机夜景模式为什么要举 3 秒?8 帧 RAW 堆栈 SNR 实测
前端