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
。
评论