Rozwiązanie z komentarzem
Opublikowano 26 lipca 2026Rozwiązanie
type Split<S extends string, D extends string> = S extends `${infer Head}${D}${infer Tail}` ? [Head, ...Split<Tail, D>] : [S]
Najczęstsza błędna odpowiedź
type Split<S extends string, D extends string> = S extends `${infer Head}${D}${infer Tail}` ? [Head, Split<Tail, D>] : [S]
Bez rozwinięcia każdy wynik rekurencji zagnieżdża się o poziom głębiej: `["a", ["b", ["c"]]]`. To `...` spłaszcza rekurencję w jedną krotkę.
Linia po linii
`${infer Head}${D}${infer Tail}`Wnioskowanie z literału szablonowego jest zachłanne od lewej, więc `Head` wiąże najkrótszy przedrostek pozwalający dopasować resztę wzorca — dając pierwsze pole, nie ostatnie.
[Head, ...Split<Tail, D>]Rozwinięcie wstawia krotkę z rekurencji w miejscu, więc każdy poziom dokłada jeden element do płaskiego wyniku.
: [S]Nie został już żaden separator. Cały pozostały łańcuch to ostatni fragment, opakowany w krotkę, żeby rozwinięcie powyżej miało co wstawić.
Do zapamiętania
Rekurencyjne typy łańcuchowe rozkładają się od głowy i składają z powrotem rozwinięciami. Zapomniane rozwinięcie to najczęstszy błąd przy budowaniu list na poziomie typów.