理解TypeScript中的infer关键字 #94
zhangyu1818
announced in
zh-cn
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
前言
infer
是在typescript 2.8
中新增的关键字,距离现在3.9.3
已经有两年出头了,趁着今天刚好使用了infer
,所以好好整理一番infer
infer
可以在extends
的条件语句中推断待推断的类型例如在文档的示例中,使用
infer
来推断函数的返回值类型在这个例子中,
infer R
代表待推断的返回值类型,如果T
是一个函数,则返回函数的返回值,否则返回any
仅仅通过这一个例子,是很难看出
infer
是用来干什么的,还需要多看几个例子infer解包
infer
的作用不止是推断返回值,还可以解包,我觉得这是比较常用的假如想在获取数组里的元素类型,在不会
infer
之前我是这样做的上次我写了20多行,就为了获取一堆各种不同类型的数组里的元素类型,然而如果使用
infer
来解包,会变得十分简单这里
T extends (infer R)[] ? R : T
的意思是,如果T
是某个待推断类型的数组,则返回推断的类型,否则返回T
再比如,想要获取一个
Promise<xxx>
类型中的xxx
类型,在不使用infer
的情况下我想不到何解infer推断联合类型
还是官方文档的例子
同一个类型变量在推断的值有多种情况的时候会推断为联合类型,针对这个特性,很方便的可以将元组转为联合类型
React中infer的使用
在
React
的typescript
源码中应该常常使用infer
就拿
useReducer
来举例子,如果我们这样使用useReducer
这里
useReducer
会报一个类型错误,说""
不能赋值给number
类型那么
React
这里是如何通过reducer
函数的类型来判断state
的类型呢?查看
userReducer
的定义,定义如下一切明了了,使用了
infer
推断reducer
函数里的state
参数类型我今天遇见的问题
今天使用
ant-design-chart
,库里没有把Ref
的定义导出,所以只能自己取了有了上面的学习,这里就很简单了,只需要取出
React.MutableRefObject
里的内容,一行infer
搞定总结
infer
是非常有用的,如果想要摆脱仅仅是在写带类型的javascript
,高级特性一定要了解我可能一年前就看见
infer
了,一直没有好好学,原因除了自己懒,还有就是水平确实不够,今年再学明显感觉不同了。再推荐一篇很好的文章,我也是看了这篇文章才好好学习了一下
infer
,这篇文章讲的更复杂一点Vue3 跟着尤雨溪学 TypeScript 之 Ref 类型从零实现
题外话 分享一道比较复杂的练习题
原题就不贴出了,在这里可以看见 github
分享一下我的思路
extends
关键字可以判断是否是函数,是返回键名,不是返回never
,最后使用映射类型[keyof T]
的方式来获取键名的联合类型,因为never
和任何类型组联合类型都会过滤掉never
,所以自然排除了never
infer
硬推题解如下:
也不知道自己写的对不对,总觉得怪怪的,可以讨论一下
参考资料:
Beta Was this translation helpful? Give feedback.
All reactions