Saltar al contenido
webtype.orgwebtype.org#266 zip-object · par 5

    ↑↓ mover · ⏎ abrir · esc cerrar

    N.º 266 · 18 de septiembre de 2026 · Brutal

    Comprime un objeto

    Implementa `ZipObject<Keys, Values>` para que las posiciones correspondientes de las tuplas se conviertan en propiedades. Detente cuando se termine cualquiera de las dos.

    01

    Intenta el puzle tú mismo

    Par 5

    Puzle

    zip-object.ts
    type Prettify<T> = { [K in keyof T]: T[K] }
    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

    3
    • ZipObject<['id', 'name'], [1, 'Ada']>
      { id: 1; name: 'Ada' }
    • ZipObject<['a'], [true, false]>
      { a: true }
    • ZipObject<['a', 'b'], [1]>
      { a: 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 19 de septiembre de 2026

    La solución

    type ZipObject<
      Keys extends readonly PropertyKey[],
      Values extends readonly unknown[]
    > = Prettify<
      Keys extends readonly [infer K extends PropertyKey, ...infer KR extends PropertyKey[]]
        ? Values extends readonly [infer V, ...infer VR]
          ? { [P in K]: V } & ZipObject<KR, VR>
          : {}
        : {}
    >

    El error más común

    type ZipObject<Keys extends readonly PropertyKey[], Values extends readonly unknown[]> =
      Keys extends readonly [infer K extends PropertyKey, ...infer KR extends PropertyKey[]]
        ? Values extends readonly [infer V, ...infer VR]
          ? { [P in K]: V } & ZipObject<KR, VR>
          : {}
        : {}

    Las propiedades son correctas, pero el resultado sigue siendo una intersección de objetos de una propiedad. La asignabilidad lo acepta; este comprobador exige identidad exacta, así que el mapeo final forma parte de la respuesta.

    Línea por línea

    1. { [P in K]: V } & ZipObject<KR, VR>

      Cada paso consume una posición de ambas tuplas e intersecta esa propiedad con el resto construido de forma recursiva.

    2. Prettify<

      Mapear las claves acumuladas materializa un único tipo de objeto normal, que es la forma nombrada por las pruebas.

    Para recordar

    Los constructores recursivos de objetos suelen acumular intersecciones. Un mapeo de identidad final no es cosmético cuando importa la igualdad exacta.

    Usa