Solución comentada
Publicado el 7 de agosto de 2026La solución
type Flatten<T extends readonly unknown[]> = T extends readonly [infer H, ...infer R] ? H extends readonly unknown[] ? [...Flatten<H>, ...Flatten<R>] : [H, ...Flatten<R>] : []
El error más común
type Flatten<T extends readonly unknown[]> = T extends readonly [infer H, ...infer R] ? H extends readonly unknown[] ? [...H, ...Flatten<R>] : [H, ...Flatten<R>] : []
Expandir `H` directamente quita exactamente una capa, así que `[[[1]]]` se aplana a `[[1]]` y se detiene. La cabeza también debe aplanarse recursivamente — no es solo un contenedor que abrir, es toda una estructura anidada.
Línea por línea
H extends readonly unknown[]La rama que decide si este elemento hay que abrirlo. `readonly unknown[]` encaja con tuplas mutables y de solo lectura, así que ninguna se toma por un escalar por accidente.
[...Flatten<H>, ...Flatten<R>]Dos llamadas recursivas, una que baja al anidamiento y otra que avanza por la tupla. Ese par es lo que hace el aplanado total en vez de de un solo nivel.
Para recordar
Recurrir en una dirección recorre una lista; en dos, un árbol. Casi todos los fallos de «solo bajó un nivel» son una segunda llamada recursiva que falta.