IsNever
挑战
实现类型 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。
评论