Zip

Challenge

In This Challenge, You should implement a type Zip<T, U>, T and U must be Tuple

type exp = Zip<[1, 2], [true, false]>; // expected to be [[1, true], [2, false]]

Solution

Zur Lösung dieses Problems können wir wieder variadic tuple types mit infer nutzen, um jedes Element einzeln aus einer Tupel in eine Typ-Variable zu extrahieren. Wichtig ist hierbei, dass wir dies für beide Tupeln T und U umsetzen:

// TH steht hier für THead, also Anfang, TR für TRest, also das Ende oder der Rest.
type Zip<T, U> = T extends [infer TH, ...infer TR]
  ? U extends [infer UH, ...infer UR]
    ? never
    : never
  : never;

Befindet sich in beiden Elementen noch ein Element, so können wir einfach nun TH und UH in einer neuen Tupel zusammenführen. Zuvor sollten wir allerdings noch einen Akkumulator definieren, und diese neue Tupel zwischenzuspeichern. Diese neue Tupel führen ergänzen wir einfach im Akkumulator, und rufen den Typ erneut mit dem Rest TR sowie UR auf, bis eine der Tulpen leer ist. Zum Schluss müssen wir noch den Akkumulator, der nun alle zusammengeführten Tupeln enthält, zurückgeben.

type Zip<T, U, Acc extends any[] = []> = T extends [infer TH, ...infer TR]
  ? U extends [infer UH, ...infer UR]
    ? // Zusammenfuergen von TH und UH, falls beide vorhanden.
      Zip<TR, UR, [...Acc, [TH, UH]]>
    : Acc
  : Acc;

References