Skip to content

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 nevernever 本质上是一个没有成员的联合类型, 这导致了 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>>,
]

参考