Rozwiązanie z komentarzem
Opublikowano 25 sierpnia 2026Rozwiązanie
type MyRequired<T> = { [K in keyof T]-?: T[K] }Najczęstsza błędna odpowiedź
type MyRequired<T> = { [K in keyof T]: T[K] }To mapowanie tożsamościowe — i tu kryje się niespodzianka: typ mapowany po keyof T jest *homomorficzny*, więc przenosi istniejące modyfikatory ? i readonly, zamiast je gubić. Właściwości opcjonalne pozostają opcjonalne, a typ się nie zmienia.
Linia po linii
-?Minus odejmuje modyfikator. Robi dwie rzeczy naraz: klucz przestaje być opcjonalny, a
undefinedznika z typu wartości — dlategotitle?: stringstaje siętitle: string, a nietitle: string | undefined.{ [K in keyof T]Mapowanie wprost po
keyof Tczyni to homomorficznym, a homomorficzność jest tym, co w ogóle pozwala dziedziczyć modyfikatory. Zmapuj po wyliczonym zbiorze kluczy, a wszystkie modyfikatory domyślnie przepadną.
Do zapamiętania
+ i - przed ? lub readonly to jedyny sposób zmiany modyfikatorów właściwości. Bez nich typ mapowany po cichu zachowuje to, co było — dlatego „nic się nie stało” to bardzo częsty błąd.

