对ts中never的理解

572 阅读1分钟

引发观点

今天在写代码中发现一个神奇的东西

type IsNever<T> = T extends never ? true : false
type Res1 = IsNever<never> // 结果是never.

type Res2 = never extends never ? true : false // 结果是true.

一开始理解,Res1和Res2的结果应该一样的。

猜想

这里有两种猜想:

  1. 这是ts的bug。
  2. 对于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

相关资源

type-challenge