Solución comentada
Publicado el 17 de septiembre de 2026La solución
type Tail<T extends readonly unknown[]> = T extends [unknown, ...infer R] ? R : []El error más común
type Tail<T extends readonly unknown[]> = T extends [unknown, infer R] ? R : []Sin el spread, [unknown, infer R] describe una tupla de exactamente dos elementos y R es el segundo *elemento*, no el resto de la tupla. Tail<[1, 2, 3]> no coincide con nada y cae a []; Tail<[1, 2]> devolvería 2 — un número donde se esperaba una tupla.
Línea por línea
[unknown, ...infer R]unknownen la posición de cabeza empareja cualquier elemento sin nombrarlo, y el spread hace queRsea el resto, sea cual sea su longitud.: []La tupla vacía no tiene cabeza que quitar, así que nunca coincide con el patrón y responde por ella la rama de reserva. Quitar nada de nada sigue siendo nada.
Para recordar
Un spread en un patrón de tupla es la diferencia entre «el siguiente» y «todos los demás». Omitirlo cambia en silencio con qué llega siquiera a coincidir tu patrón.

