Solución comentada
Publicado el 25 de agosto de 2026La solución
type MyRequired<T> = { [K in keyof T]-?: T[K] }El error más común
type MyRequired<T> = { [K in keyof T]: T[K] }Este es el mapeo identidad, y ahí está la sorpresa: un tipo mapeado sobre keyof T es *homomórfico*, así que copia los modificadores ? y readonly existentes en vez de descartarlos. Las propiedades opcionales siguen siendo opcionales y el tipo no cambia.
Línea por línea
-?El menos resta el modificador. Hace dos cosas a la vez: la clave deja de ser opcional y se elimina
undefineddel tipo del valor — por esotitle?: stringqueda comotitle: stringy notitle: string | undefined.{ [K in keyof T]Mapear directamente sobre
keyof Tes lo que lo hace homomórfico, y lo homomórfico es lo que permite heredar modificadores. Mapea sobre un conjunto de claves calculado y todos los modificadores se pierden por defecto.
Para recordar
+ y - antes de ? o readonly son la única forma de cambiar los modificadores de una propiedad. Sin ellos, un tipo mapeado conserva en silencio lo que ya había, lo que hace de «no pasó nada» un fallo muy común.

