[TypeScript] Type Challenges #3192 - Reverse

12 阅读1分钟

题目描述

Implement the type version of Array.reverse

For example:

type a = Reverse<['a', 'b']> // ['b', 'a']
type b = Reverse<['a', 'b', 'c']> // ['c', 'b', 'a']

题解

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

type cases = [
  Expect<Equal<Reverse<[]>, []>>,
  Expect<Equal<Reverse<['a', 'b']>, ['b', 'a']>>,
  Expect<Equal<Reverse<['a', 'b', 'c']>, ['c', 'b', 'a']>>,
]

type errors = [
  // @ts-expect-error
  Reverse<'string'>,
  // @ts-expect-error
  Reverse<{ key: 'value' }>,
]


// ============= Your Code Here =============
type Reverse<T extends unknown[]> = 
  T extends [infer Head, ...infer Tail]
    ? [...Reverse<Tail>, Head]
    : []

条件类型

  • T extends [infer Head, ...infer Tail] ? ... : ...

    • 如果T是非空数组:

      • 使用infer Head推导数组的第一个元素

      • 使用...infer Tail推导数组的剩余部分

      • [...Reverse<Tail>, Head]

        • 递归调用Reverse<Tail>反转剩余部分

        • Head追加到反转后的数组末尾

    • 如果T是空数组:

      • 返回[]