# 1042-isNever
# 题目描述
Implement a type IsNever, which takes input type T
. If the type of resolves to never
, return true
, otherwise false
.
For example:
type A = IsNever<never>; // expected to be true
type B = IsNever<undefined>; // expected to be false
type C = IsNever<null>; // expected to be false
type D = IsNever<[]>; // expected to be false
type E = IsNever<number>; // expected to be false
# 分析
可以通过 Equal 来进行判断。
那如果不借助 Equal 呢?
可以做几个例子:
// true
type Case1 = never extends never ? true : false;
type isNever<T> = T extends never ? true : false;
// false
type Case2 = isNever<never>;
// false
type Case3 = isNever<[]>;
// false
type Case4 = isNever<0>;
// false
type Case5 = isNever<''>;
从实际看,Case1 对 never 的判断非常精准,但是当转为泛型后,Case2 对 never 的判断就失效了。这个本质还是因为 ts 的分发特性,原本是对于联合类型会做分发处理,可以参考 实现 Exclude。但是这个特性仅在泛型下生效,所以 Case1 是正确的,而 Case2 触发了分发特性,但是 never 本身又没有什么元素可以分发,所以直接返回了 never。
而官方文档 (opens new window)也写了,想要消除分发特性,用 []
包裹下就行。
# 题解
type IsNever<T> = [T] extends [never] ? true : false;
# 知识点
- 判断 never:
[T] extends [never] ? true : false