Saltar al contenido
#242 merge-objects · par 3

    ↑↓ mover · ⏎ abrir · esc cerrar

    N.º 242 · 25 de agosto de 2026 · Media

    Fusiona

    Implementa `Merge<A, B>` para que combine dos tipos objeto en un objeto plano. Donde ambos definan una clave, gana `B`.

    01

    Intenta el puzle tú mismo

    Par 3

    Puzle

    merge-objects.ts
    Intento 1 de 3Aú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
    • Merge<{ a: string }, { b: number }>
      { a: string; b: number }
    • Merge<{ a: string }, { a: number }>
      { a: number }
    • Merge<{}, { a: 1 }>
      { a: 1 }
    • Merge<{ a: 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 26 de agosto de 2026

    La solución

    type Merge<A, B> = {
      [K in keyof A | keyof B]: K extends keyof B
        ? B[K]
        : K extends keyof A
          ? A[K]
          : never
    }

    El error más común

    type Merge<A, B> = A & B

    Una intersección no es una fusión. Para claves disjuntas es solo la *forma* equivocada — asignable a la respuesta pero no igual a ella. Para una clave compartida es directamente errónea: `{ a: string } & { a: number }` exige un valor que sea ambos, así que la propiedad se vuelve `never` en lugar de dejar que `B` sobrescriba a `A`.

    Línea por línea

    1. K in keyof A | keyof B

      Mapear sobre la unión de ambos conjuntos de claves es lo que produce un único objeto plano. Como el conjunto de claves es calculado y no un `keyof T` desnudo, este mapeo no es homomórfico — se pierden los modificadores de ambas fuentes.

    2. K extends keyof B ? B[K]

      La precedencia se expresa con el orden. Comprobar `B` primero hace que una clave compartida se resuelva al tipo de `B` y nunca se consulte `A`; intercambiar las ramas daría gratis una fusión donde gana `A`.

    Para recordar

    La intersección compone restricciones; la fusión las reemplaza. Coinciden solo cuando los conjuntos de claves son disjuntos, por eso `A & B` parece funcionar justo hasta que dos objetos comparten un campo.

    Usa