TS 中的 unknown 与 never
从 IsNever 认识 never
IsNever 用于判断一个类型是否为 never,不妨思索一下如何判断一个类型是 never,下方是正确写法
type IsNever<T> = [T] extends [never] ? true : false
为什么不是这个呢
type IsNever<T> = T extends never ? true : false
因为 never 在 extends 时被当作空的联合类型分发,所以三元运算符一定输出 false
正确的写法中,包裹一层以后作为一个整体看待,不会被分发
所以可以将 never 看作一个恒为空的联合类型(但实际上 never 是类似于 number、string 一样的一个类型)
或者这样表述更为合理——never
unknown
unknown 是晚于 never 诞生的,它和 never 很像,但有本质区别
在 TS 的类型系统中,除去复杂类型,有以下基础类型
stringnumberbooleansymbolbigintnullundefined
并有以下特殊类型
neverunknownanyvoid
其中,存在 never extends T 恒为 true,T extends unknown 恒为 true
这很难让人不联想到范畴论中的初始对象从它出发到任何对象都有唯一箭头与终端对象从任何对象到它都有唯一箭头
所以 never 象征着底层,而 unknown 象征着顶层
any
说到了 unknown,不得不提及 any
如果把 TS 的类型系统看作一个范畴,any 既不是终端对象,也不是初始对象,更像是打破范畴的特殊单元。any 可以主动绕过 TS 的校验,让原有的类型系统变得不可预测;但为了保持灵活、降低上手难度,any 又不得不存在