Solución comentada
Publicado el 26 de agosto de 2026La 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 & BUna 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
K in keyof A | keyof BMapear 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.
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.
