Reverse

Challenge

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

Solution

Die naheliegendste Lösung ist der Herausforderung ist es, den Array mittels infer zu durchlaufen und immer das aktuelle Element an letzte Stelle eines neuen Arrays packt, welcher dann beim Auflösen der Rekursion mittels Spread-Operator zu einem einzigen zusammengeführt wird.

type Reverse<T extends unknown[]> = T extends [infer H, ...infer Rest]
  ? [...Reverse<Rest>, H]
  : T;

Als weitere Lösung kann man das Problem durch den Einsatz eines Akkumulators mittels einer Tail-Rekursion umsetzen:

type Reverse<T, Acc extends any[] = []> = T extends [infer H, ...infer R]
  ? Reverse<R, [H, ...Acc]>
  : Acc;

References