TS的类型转换
元组类型转联合类型
元组类型转联合类型2
联合类型转交叉类型
将这个方法拆成两部分来看:
(U extends any ? (k: U) => void : never)
是第一部分
extends (k: infer I) => void ? I : never
是第二部分
先看第一部分,TS中如果泛型后跟extends
且这个泛型在实际传值是联合类型,则会遍历这个联合类型,取出联合类型中的每个具体类型做实际操作,最后返回每个类型的结果的联合类型
用U=string|number
举例,第一部分实际上做的的操作是
(string extends any ? (k:string) => void :never) | (number extends any ? (k:number) => void :never)
简化之后的结果就是((k:string)=>void)|((k:number)=>void)
,这是两个函数类型的联合类型
再看第二部分,利用了infer的函数参数类型推断,翻译一下就是如果想要找出一个函数
使它满足一定条件后能被((k:string)=>void)|((k:number)=>void)
赋值
那么这个函数一定是(k:string&number)=>void
从而推得函数参数类型是string&number
作为结果
对象属性转联合类型
键值对转对象属性
其他
去除readonly
in 遍历时用 as 断言约束
是否为联合类型
联合类型作为泛型的时候
extends
会触发分发执行
联合类型T
写成[T]
就变成了普通类型,extends
的时候不会分发执行
是否为never类型
never
是一个空的联合类型,因此要通过[T]
将其变成普通类型,再去extends
[T]
和[never]
为元组,作为包装类型,如果联合类型被包装过,就不会被展开。
另外,因为never
类型不能扩展never
类型,但是never[]
可以扩展never[]