Join

Challenge

Implement the type version of Array.join, Join<T, U> takes an Array T, string or number U and returns the Array T with U stitching up.

type Res = Join<["a", "p", "p", "l", "e"], "-">; // expected to be 'a-p-p-l-e'
type Res1 = Join<["Hello", "World"], " ">; // expected to be 'Hello World'
type Res2 = Join<["2", "2", "2"], 1>; // expected to be '21212'
type Res3 = Join<["o"], "u">; // expected to be 'o'

Solution

Zur Lösung dieses Problems nutzen wir Template Literal Types, um immer das erste Zeichen aus der Zeichenkette zu extrahieren.

type Join<T extends string[], U extends string | number> = T extends [
  infer H extends string,
  // extends string[] stellt sicher, dass TypeScript R als string[] erkennt
  ...infer R extends string[]
]

Sobald wir die Typvariable H extrahiert haben, können wir eine neue Zeichenkette erstellen. Diese setzt sich aus der Typvariablen H, dem Separator U, sowie einem rekursiven Aufruf zur Umwandlung der restlichen Zeichenkette zusammen.

type Join<T extends string[], U extends string | number> = T extends [
  infer H extends string,
  ...infer R extends string[]
]
  ? R["length"] extends 0
    ? H
    : `${H}${U}${Join<R, U>}`
  : "";

References