CamelCase
Challenge
Implement CamelCase<T> which converts snake_case string to camelCase.
For example
type camelCase1 = CamelCase<"hello_world_with_types">; // expected to be 'helloWorldWithTypes'
type camelCase2 = CamelCase<"HELLO_WORLD_WITH_TYPES">; // expected to be same as previous one
Solution
Zuerst benötigen wir eine Hilfsfunktion, die bestimmt, ob ein Zeichen auch alphabetischer Natur ist, damit wir in diesem Fall nur die alphabetischen Zeichen vergrößern.
// IsCharNonAlpabletical<'🤣'> => true
// IsCharNonAlpabletical<'t'> => false
type IsCharNonAlpabletical<T extends string> = Lowercase<T> extends Uppercase<T>
? true
: false;
Der finale Typ erhält drei Parameter, von denen nur einer übergeben wird. Die anderen dienen als Variablen zum Speichern von Werten
- Die Zeichenkette, den man anpassen soll
- Die vorherige Zeichenkette, initial ist diese leer
- Das Ergebnis als Zeichenkette, auch initial leer
Die Logik ist simpel: Sobald das vorherige Zeichen ein Unterstrick-Zeichen (”_”) war, wird das aktuelle Zeichen großgeschrieben, ansonsten wird das Zeichen verkleinert. Das aktuelle Zeichen sowie den Rest des Strings lassen wir inferen, und rufen den Typ so lange rekursiv auf, bis wir einmal durch den String gelaufen sind. Dann geben wir den in (3) gespeicherten, neuen String zurück.
type Underscode = "_";
type CamelCase<
S extends string,
Prev extends string = "",
Result extends string = ""
> = S extends `${infer H}${infer Rest}`
? CamelCase<
Rest,
H,
`${Result}${H extends Underscode
? ""
: Prev extends Underscode
? Uppercase<H>
: Lowercase<H>}`
>
: Result;