引发观点
今天在写代码中发现一个神奇的东西
type IsNever<T> = T extends never ? true : false
type Res1 = IsNever<never> // 结果是never.
type Res2 = never extends never ? true : false // 结果是true.
一开始理解,Res1和Res2的结果应该一样的。
猜想
这里有两种猜想:
- 这是ts的bug。
- 对于never有两种解释,never既可以表现为ts的类型,又可以表示为确确实实不存在的类型。(十有八九是这样)
深入猜想
当never直接运算时(不透过泛型进行计算),表现为ts的类型。 比如
type Res2 = never extends never ? true : false
当never透过泛型进行计算时,表现为确确实实不存在的类型,所以一个不存在的东西不能 extends never,无法计算,返回值不存在,结果就为never了。 比如
type IsNever<T> = T extends never ? true : false
type Res1 = IsNever<never>
IsNever的正解
大概就是加了个[],ts就不会把它当成不存在的东西,而是真真实实的类型的。
type IsNever<T> = [T] extends [never] ? true : false