Solución comentada
Publicado el 8 de agosto de 2026La solución
type Permutation<T, K = T> = [T] extends [never] ? [] : K extends K ? [K, ...Permutation<Exclude<T, K>>] : never
El error más común
type Permutation<T> = T extends T ? [T] : never
Esto distribuye y envuelve cada miembro en su propia tupla, dando `["a"] | ["b"]` — cada miembro solo, nunca combinado. Además responde `never` para `never`, porque distribuir sobre la unión vacía no produce nada en vez de la tupla vacía.
Línea por línea
[T] extends [never]El envoltorio de tupla suprime la distribución, algo esencial aquí: un condicional distributivo sobre `never` produce `never` y nunca se alcanzaría el caso base.
K extends KUn condicional trivialmente cierto, usado solo por su efecto secundario: distribuye `K` para que la rama de abajo se ejecute una vez por miembro. `K` toma por defecto `T`, guardando una copia intacta mientras `Exclude` estrecha `T`.
Para recordar
`K extends K` es el modismo para «distribuye esta unión» y `[T] extends [never]` para «no lo hagas». Conocer ambos, y cuál necesita cada línea, es casi toda la diferencia entre código a nivel de tipos que funciona y código que devuelve `never` en silencio.