never
之前说过typescript Distributive Conditional Types ts 的分配率,这使得我们比较难以用泛型去判断 never 类型,比如下面的代码,我们希望如果 T 是 never 的话,输出是true, 以便于我们做后续的一些判断。但由于分配率的关系,如果我们输入的类型是 never,条件语句一次都不会执行,输出为
空
(即 never) type BadIsNever<T>= T extends never ? true : false
我们可以利用之前讲的规则,在 condition 的时候对泛型进行一定的修改,就不会再执行结合律了,代码也就能按照我们想的那样判断出结果了:
type IsNever<T>= [T] extends [never] ? true : false
undefined, unknown
还有这两个,感觉和 never 差不多的,应该怎么判断?
我们还是可以用之前的方法:
type Foo1 = [never] extends [undefined] ? 1: 0 // 1
type Foo2 = [never] extends [unknown] ? 1: 0 // 1
type Foo3 = [undefined] extends [unknown] ? 1: 0 // 1
type Foo4 = [undefined] extends [never] ? 1: 0 // 0
type Foo5 = [unknown] extends [undefined] ? 1: 0 // 0
type Foo6 = [unknown] extends [never] ? 1: 0 // 0
可以得出这样的结论:
"never" {extends} "undefined" {extends} "unknown"
// 如果把他们想成集合,则三者是一个套娃的关系
"never" < "undefined" < "unknown"
知道了这层关系,其实就很好判断一个类型是不是三者或者其中之一了