Drop String
Challenge
Drop the specified chars from a string.
For example:
type Butterfly = DropString<"foobar!", "fb">; // 'ooar!'
Solution
Zur Lösung dieses Problems definieren wir wieder einen Hilfstypen, der uns eine Zeichenkette in eine Vereinigung von string literals umwandelt.
Dafür wird eine Zeichenkette durchlaufen uns jedes Zeichen in einem Akkumulator zwischengespeichert, bis am Ende über den lookup-type number alle Elemente der Tupel als Vereinigung zurückgegeben werden.
type StringToUnion<
S extends string,
Acc extends string[] = []
> = S extends `${infer H}${infer Rest extends string}`
? StringToUnion<Rest, [...Acc, H]>
: Acc[number];
Der Hilfstyp StringToUnion ermöglicht es uns nun, in einem konditionellen Typen die mit infer extrahierte Typvariable auf das Vorkommen in U zu testen, und diesen entsprechend zu entfernen, falls in U vorhanden.
type DropString<
T extends string,
U extends string,
K = StringToUnion<U>,
Acc extends string = ""
> = T extends `${infer H}${infer Rest}`
? H extends K
? DropString<Rest, U, K, Acc>
: DropString<Rest, U, K, `${Acc}${H}`>
: Acc;