Annotated solution
Published September 17, 2026The solution
type Tail<T extends readonly unknown[]> = T extends [unknown, ...infer R] ? R : []The common wrong answer
type Tail<T extends readonly unknown[]> = T extends [unknown, infer R] ? R : []Without the spread, [unknown, infer R] describes a tuple of exactly two elements and R is the second *element*, not the rest of the tuple. Tail<[1, 2, 3]> matches nothing and falls to []; Tail<[1, 2]> would return 2 — a number where a tuple was expected.
Line by line
[unknown, ...infer R]unknownin the head position matches any single element without naming it, and the spread makesRthe remainder however long it is.: []The empty tuple has no head to remove, so it never matches the pattern and the fallback answers for it. Removing nothing from nothing is still nothing.
Takeaway
A spread in a tuple pattern is the difference between "the next one" and "all the others". Leaving it out silently changes what your pattern will even match.

