Przejdź do treści
webtype.orgwebtype.org

    ↑↓ ruch · ⏎ otwórz · esc zamknij

    Nr 241 · 24 sierpnia 2026 · Łatwa

    Odtwórz Required

    Zaimplementuj MyRequired<T>, aby każda opcjonalna właściwość stała się wymagana. To dokładna odwrotność zagadki nr 219.

    01

    Spróbuj rozwiązać samodzielnie

    Par 2

    Zagadka

    rebuild-required.ts
    interface Draft {
      title?: string
      body?: string
    }
    Podejście 1 z 2Jeszcze nie sprawdzone

    Zastąp ??? — rozwiązanie sprawdzamy przypadkami poniżej. Tab wcina; naciśnij Escape, a potem Tab, by wyjść fokusem.

    Testy

    3
    • MyRequired<Draft>—
      → { title: string; body: string }
    • MyRequired<{ a?: number }>—
      → { a: number }
    • MyRequired<{ a: string }>—
      → { a: string }

    Jak oceniamy test Dokładna równość typów, nie przypisywalność — przecięcie to nie to samo co spłaszczony obiekt.

    Jak poszło innym

    Tę zagadkę rozwiązało jak dotąd mniej niż 5 osób. Rozkład pojawi się, gdy próbka będzie na tyle duża, by coś znaczyć.

    Gra na krótkim dystansie

    Najmniej znaków

    Nie ma jeszcze publicznych wyników.

    Archiwum
    02

    Rozwiązanie z komentarzem

    Opublikowano 25 sierpnia 2026

    Rozwią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

    1. -?

      Minus odejmuje modyfikator. Robi dwie rzeczy naraz: klucz przestaje być opcjonalny, a undefined znika z typu wartości — dlatego title?: string staje się title: string, a nie title: string | undefined.

    2. { [K in keyof T]

      Mapowanie wprost po keyof T czyni 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.

    Wykorzystuje