Saltar al contenido
webtype.org#230 permutation · par 5

N.º 230 · 7 de agosto de 2026 · Brutal

Permutación

Implementa `Permutation<T>` para que convierta una unión en la unión de todas las ordenaciones en tupla de sus miembros. `never` tiene exactamente una permutación: la tupla vacía.

01

Intenta el puzle tú mismo

Par 5

Puzle

permutation.ts
Intento 1 de 5Aún sin comprobar

Sustituye ??? — tu solución se comprueba con los casos de abajo. Tab indenta; pulsa Escape y luego Tab para sacar el foco.

Comprobaciones

4
  • Permutation<'a'>
    ['a']
  • Permutation<never>
    []
  • Permutation<'a' | 'b'>
    ['a', 'b'] | ['b', 'a']
  • Permutation<1 | 2>
    [1, 2] | [2, 1]

Cómo se juzga una comprobación Igualdad exacta de tipos, no asignabilidad — una intersección no es lo mismo que el objeto aplanado.

Cómo le fue a todo el mundo

Menos de 5 personas han resuelto este puzle hasta ahora. La distribución aparece cuando la muestra sea lo bastante grande como para significar algo.

Archivo
02

Solución comentada

Publicado el 8 de agosto de 2026

La 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

  1. [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.

  2. K extends K

    Un 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.