Replace Union
Challenge
Given an union of types and array of type pairs to replace ([[string, number], [Date, null]]), return a new union replaced with the type pairs.
Solution
Zur Lösung dieses Problems definieren erst einen Hilfstypen, der aus dem Array aus Tupeln jede Tupel durchläuft. Falls wir den Typen an der ersten Stelle in einer Tupel finden, geben wir einfach den Typ an der zweiten Stelle zurück.
type ExchangeType<T, U extends [any, any][]> = U extends [
// Wir durchlaufen den Array und extrahieren immer die erste Tupel, z.B. [string, number]
infer H,
...infer R extends [any, any][]
]
? // Wir extrahieren beide Typen aus der Tupel und speichern diese in den Typvariablen From und To (z.B. From = string, To = number bei [string, number])
H extends [infer From, infer To]
? // Sind T und From gleich, so geben wir To zurueck.
T extends From
? To
: ExchangeType<T, R>
: T
: T;
Nun können wir einfach den Hilfstypen ExchangeTyp für jedes Element der Vereinigung anwenden (siehe distributive Vereinigungen in konditionellen Typen).
type UnionReplace<T, U extends [any, any][]> = T extends T
? ExchangeType<T, U>
: T;