type KebabCase<S extendsstring> =
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 extendsstring> = 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
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.