理解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
Uh oh!
There was an error while loading. Please reload this page.
-
前言
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