Przejdź do treści
webtype.orgwebtype.org#267 kebab-case · par 4

    ↑↓ ruch · ⏎ otwórz · esc zamknij

    Nr 267 · 19 września 2026 · Trudna

    Kebab case

    Zaimplementuj `KebabCase<S>`, aby napis w camelCase lub PascalCase stał się małymi słowami połączonymi myślnikami.

    01

    Spróbuj rozwiązać samodzielnie

    Par 4

    Zagadka

    kebab-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

    3
    • KebabCase<'FooBar'>
      'foo-bar'
    • KebabCase<'alreadyKebab'>
      'already-kebab'
    • KebabCase<'plain'>
      'plain'

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

    Gra na krótkim dystansie

    Najmniej znaków

    Nie ma jeszcze publicznych wyników.

    Archiwum
    02

    Rozwiązanie z komentarzem

    Opublikowano 20 września 2026

    Rozwiązanie

    type KebabCase<S extends string> =
      S extends `${infer H}${infer R}`
        ? R extends Uncapitalize<R>
          ? `${Lowercase<H>}${KebabCase<R>}`
          : `${Lowercase<H>}-${KebabCase<R>}`
        : S

    Najczęstsza błędna odpowiedź

    type KebabCase<S extends string> = Lowercase<S>

    `Lowercase` zmienia litery, ale zapomina, gdzie były granice słów. Gdy wszystkie wielkie litery znikną, nie zostaje informacja potrzebna do wstawienia myślników.

    Linia po linii

    1. R extends Uncapitalize<R>

      Sufiks zaczyna się małą literą, gdy `Uncapitalize` niczego w nim nie zmienia. Jeśli zmienia, pierwszy znak wyznacza nowe słowo.

    Do zapamiętania

    Konwersja wielkości liter musi wykryć granice przed normalizacją, bo transformacja niszczy dowód potrzebny do parsowania.

    Wykorzystuje