Rozwiązanie z komentarzem
Opublikowano 17 września 2026Rozwiązanie
type Tail<T extends readonly unknown[]> = T extends [unknown, ...infer R] ? R : []Najczęstsza błędna odpowiedź
type Tail<T extends readonly unknown[]> = T extends [unknown, infer R] ? R : []Bez rozwinięcia [unknown, infer R] opisuje krotkę o dokładnie dwóch elementach, a R to drugi *element*, nie reszta krotki. Tail<[1, 2, 3]> nie pasuje do niczego i spada do []; Tail<[1, 2]> zwróciłoby 2 — liczbę tam, gdzie oczekiwano krotki.
Linia po linii
[unknown, ...infer R]unknownna pozycji głowy pasuje do dowolnego pojedynczego elementu, nie nazywając go, a rozwinięcie sprawia, żeRjest resztą, niezależnie od jej długości.: []Pusta krotka nie ma głowy do usunięcia, więc nigdy nie pasuje do wzorca i odpowiada za nią gałąź zapasowa. Usunięcie niczego z niczego wciąż daje nic.
Do zapamiętania
Rozwinięcie we wzorcu krotki to różnica między „następnym” a „całą resztą”. Jego pominięcie po cichu zmienia to, do czego twój wzorzec w ogóle pasuje.

