Saltar al contenido
webtype.orgwebtype.org

    ↑↓ mover · ⏎ abrir · esc cerrar

    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.

    Juego corto

    Menos caracteres

    Aún no hay marcas públicas.

    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.

    Usa