Solución comentada
Publicado el 2 de septiembre de 2026La solución
type PartialBy<T, K extends keyof T> = Flatten<Omit<T, K> & Partial<Pick<T, K>>>El error más común
type PartialBy<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>Todo aquí es correcto salvo la forma. { a: string } & { b?: number } acepta y rechaza exactamente los mismos valores que { a: string; b?: number }, pero no es el mismo *tipo*, y Equal compara tipos, no comportamiento. Una intersección son dos objetos uno al lado del otro; la comprobación pide uno solo.
Línea por línea
Omit<T, K> & Partial<Pick<T, K>>Divide el objeto en dos: las claves que se quedan como están y las que pasan a ser opcionales. Cada mitad por separado es fácil.
Flatten<...>Un mapeo homomórfico sobre la intersección recorre cada clave una vez y reconstruye un único objeto — y por ser homomórfico, el
?sobrevive al viaje.
Para recordar
Las intersecciones sirven para ensamblar un tipo de objeto; un mapeo homomórfico sirve para rematarlo. Ensamblar sin rematar es la razón más común de que una solución con buen aspecto no pase estas comprobaciones.

