Rozwiązanie z komentarzem
Opublikowano 9 sierpnia 2026Rozwiązanie
type CamelCase<S extends string> = S extends `${infer H}_${infer T}` ? `${H}${CamelCase<Capitalize<T>>}` : S
Najczęstsza błędna odpowiedź
type CamelCase<S extends string> = S extends `${infer H}_${infer T}` ? `${H}${CamelCase<T>}` : S
Podkreślnik znika, ale nic nie zostaje zapisane wielką literą, więc `"foo_bar"` daje `"foobar"`. Usunięcie separatora to tylko połowa przekształcenia — druga połowa to zmiana wielkości liter.
Linia po linii
Capitalize<T>Jeden z czterech wbudowanych typów łańcuchowych implementowanych natywnie przez kompilator — `Uppercase`, `Lowercase`, `Capitalize`, `Uncapitalize`. Nie mają źródła w TypeScripcie; są wbudowane w sprawdzarkę.
CamelCase<Capitalize<T>>Zapis wielką literą *przed* rekurencją sprawia, że każdy poziom obsługuje tylko podkreślnik najbliższy początku. `"a_b_c"` daje więc `"aBC"` — rekurencja po kolei kapitalizuje każdy pozostały segment.
Do zapamiętania
Wbudowane typy zmiany wielkości liter czynią manipulację łańcuchami na poziomie typów znacznie mniej bolesną, niż powinna być. Sięgaj po nie, zanim napiszesz rekurencję znak po znaku.