[TypeScript] Type Challenges #1042 - IsNever

44 阅读1分钟

题目描述

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

题解

// ============= Test Cases =============
import type { Equal, Expect } from './test-utils'

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>>,
]


// ============= Your Code Here =============
type IsNever<T> = [T] extends [never] ? true : false

条件判断

type IsNever<T> = [T] extends [never] ? true : false
  • [T] extends [never]:检查T是否为never

    • 如果Tnever,则[T][never],条件成立,返回true

    • 如果T不是never,则[T]不等于[never],条件不成立,返回false

为什么需要使用元组[T]

直接比较T extends never会返回never,因为never是一个特殊类型,表示“没有值”。任何类型都不能赋值给never,所以T extends never会立即失败,返回never

使用元组[T]可以保留never的信息,使得条件类型能够正确地判断T是否为never