挑战

实现类型 IsNever<T>,该类型接受输入类型T。如果 T 的类型解析为never,请返 回true,否则返回false

例如:

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

解答

这里最直观的解法是利用条件类型来检查该类型是否可以赋值给never

如果类型T可以赋值给never,返回true,否则返回false

type IsNever<T> = T extends never ? true : false;

遗憾的是,我们没有通过never本身的测试用例,这是为什么呢?

never类型表示从未出现的值的类型。never类型是 TypeScript 中任何其他类型的子类 型,因此可以将never类型赋值给任何类型。然而,没有类型是never的子类型,这意味 着除了never本身以外,不能将其他类型赋值给never

这就引出了另一个问题:如果我们不能将除never外的其他类型赋值给never,那么我们 如何检查某类型是否可以赋值给never呢?

我们何不创建内部含有never的另外一种类型呢? 如果我们不是检查类型T能否赋值 给never,而是检查该类型能否赋值给包含never的元组类型呢?在这种情况下,在形式 上我们不会将任何类型赋值给never

type IsNever<T> = [T] extends [never] ? true : false;

有了上述名为<IsNever>的解决方案,我们可以通过测试并实现泛型类型来检查传入类型 是否为never

参考