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>}`
: "";