Flatten

Challenge

In this challenge, you would need to write a type that takes an array and emitted the flatten array type.

For example:

type flatten = Flatten<[1, 2, [3, 4], [[[5]]]]>; // [1, 2, 3, 4, 5]

Solution

Zur Lösung dieses Problems müssen wir einfach mittels eines konditionellen Typen über den gesamten Array laufen, und bei jeder Iteration das erste Element sowie den Rest extrahieren. Anschließend prüfen wir, ob das Element an der ersten Stelle ein weiterer Array ist. Falls ja, rufen wir den Typen rekursiv erneut auf, und führen das Ergebnis mit dem abgeflachten Teil der restlichen Elemente zusammen. Falls nein, können wir das Element einfach in das finale Ergebnis aufnehmen, und für den Rest den Typen erneut aufrufen.

type Flatten<T extends unknown[]> = T extends [infer First, ...infer Last]
  ? First extends unknown[]
    ? [...Flatten<First>, ...Flatten<Last>]
    : [First, ...Flatten<Last>]
  : T;

References