Przejdź do treści
webtype.org#231 camel-case · par 4

Nr 231 · 8 sierpnia 2026 · Trudna

CamelCase

Zaimplementuj `CamelCase<S>`, aby zamieniał typ łańcuchowy snake_case na camelCase. Łańcuch bez podkreślnika wraca bez zmian.

01

Spróbuj rozwiązać samodzielnie

Par 4

Zagadka

camel-case.ts
Podejście 1 z 4Jeszcze nie sprawdzone

Zastąp ??? — rozwiązanie sprawdzamy przypadkami poniżej. Tab wcina; naciśnij Escape, a potem Tab, by wyjść fokusem.

Testy

4
  • CamelCase<'foo_bar'>
    'fooBar'
  • CamelCase<'foo_bar_baz'>
    'fooBarBaz'
  • CamelCase<'single'>
    'single'
  • CamelCase<'a_b_c'>
    'aBC'

Jak oceniamy test Dokładna równość typów, nie przypisywalność — przecięcie to nie to samo co spłaszczony obiekt.

Jak poszło innym

Tę zagadkę rozwiązało jak dotąd mniej niż 5 osób. Rozkład pojawi się, gdy próbka będzie na tyle duża, by coś znaczyć.

Archiwum
02

Rozwiązanie z komentarzem

Opublikowano 9 sierpnia 2026

Rozwią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

  1. 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ę.

  2. 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.