题目描述
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
是空数组:- 返回
[]
- 返回
-