IsNever
约 303 字大约 1 分钟
2022-12-01
题目
Github: IsNever
实现一个类型 IsNever,它接受输入类型 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解题思路
在 typescript 中,我们不能通过 T extends never ? true : false 判断一个类型是否为 never, 因为 在 T extends never 中 never 本质上是一个没有成员的联合类型, 这导致了 never extends never ? true : false 整体被跳过了,得到的结果为 never , 而不是 true/false。
要避免这种情况,可以在extends 两边的类型用方括号包裹,这可以避免 触发条件类型分支。
答案
type IsNever<T> = [T] extends [never] ? true : false验证
type cases = [
Expect<Equal<IsNever<never>, true>>,
Expect<Equal<IsNever<never | string>, false>>,
Expect<Equal<IsNever<''>, false>>,
Expect<Equal<IsNever<undefined>, false>>,
Expect<Equal<IsNever<null>, false>>,
Expect<Equal<IsNever<[]>, false>>,
Expect<Equal<IsNever<{}>, false>>,
]