type Reverse<T> = T extends [...infer L, infer R] ? [R, ...Reverse<L>] : [];
생각보다 코드가 간단하지요? 재귀 타입은 코드를 간단하게 만듭니다. 차례대로 따져보면,
1. [1, 2, 3] 배열 타입이 있을 때 L은 [1, 2]가 되고, R은 3이 됩니다.
2. [R, ...Reverse<L>]에서 [3, ...Reverse<[1, 2]>]가 됩니다.
3. 마찬가지 이유로 Reverse<[1, 2]>는 [2, ...Reverse<[1]>]이고,
4. Reverse<[1]>은 [1, ...Reverse<[]>]입니다.
5. Reverse<[]>는 []이므로 Reverse<[1]>은 [1]이 되고,
6. Reverse<[1, 2]>는 [2, 1],
7. Reverse<[1, 2, 3]>은 [3, 2, 1]이 됩니다.
또는 Reverse 타입을 응용해서 함수의 매개변수 순서를 바꾸는 타입을 만들 수 있습니다. 이것도 한번 만들어보세요(힌트: 함수의 매개변수와 반환값 타입을 추론하는 것은 2.22절에서 배웠습니다. 같은 절에서 매개변수 타입을 튜플로 만드는 것도 배웠습니다).