yunliuyan / type-challenges

typescript-challenges
0 stars 2 forks source link

00028-medium-isnever #28

Open yunliuyan opened 1 year ago

yunliuyan commented 1 year ago

IsNever medium #union #utils

by hiroya iizuka @hiroyaiizuka

Take the Challenge    한국어

Implement a type IsNever, which takes input type T. If the type of resolves to never, return true, otherwise false.

For example:

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

Back Share your Solutions Check out Solutions

Related Challenges

1097・IsUnion 223・IsAny 4484・IsTuple
yunliuyan commented 1 year ago

思路

在 TypeScript 中,never 是一个底类型(bottom type),表示不可达的类型,它没有任何值。因为 never 没有任何可能的实例,所以在类型系统中,never 被视为所有其他类型的子类型,即 never 可以分配给任何其他类型。

当我们使用条件类型进行类型判断时,如果条件判断的分支中存在 never 类型,那么无论条件是真还是假,最终的结果类型都将是 never。这是因为如果条件为真,那么 never 可以分配给任何其他类型,因此结果类型为 never;如果条件为假,那么分支中的代码将永远不会执行,结果类型也是 never。

在这个特定的条件类型 never extends never ? true : false 中,无论条件是真还是假,最终的结果类型都将是 never。这是因为 never 可以分配给 never,并且 never 也可以分配给 never,所以结果类型为 never。

所以可以换个思路,用数组裹起来

type IsNever<T> = [T] extends [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
Naparte commented 1 year ago

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

type A28 = 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

// https://github.com/microsoft/TypeScript/issues/31751
Janice-Fan commented 1 year ago
type IsNever<T> = [T] extends [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