Przejdź do treści
webtype.orgwebtype.org#219 rebuild-partial · par 2

    ↑↓ ruch · ⏎ otwórz · esc zamknij

    Nr 219 · 27 lipca 2026 · Łatwa

    Odtwórz Partial

    Zaimplementuj `MyPartial<T>`, aby każda właściwość stała się opcjonalna. Dopuszczenie `undefined` w wartości to nie to samo — opcjonalny musi stać się sam klucz.

    01

    Spróbuj rozwiązać samodzielnie

    Par 2

    Zagadka

    rebuild-partial.ts
    interface User {
      id: number
      name: 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
    • MyPartial<User>
      { id?: number; name?: string }
    • MyPartial<{ a: string }>
      { a?: string }
    • MyPartial<{}>
      {}

    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 28 lipca 2026

    Rozwiązanie

    type MyPartial<T> = { [K in keyof T]?: T[K] }

    Najczęstsza błędna odpowiedź

    type MyPartial<T> = { [K in keyof T]: T[K] | undefined }

    To rozszerza typ wartości, ale klucz pozostaje wymagany: nadal trzeba napisać `{ id: undefined }` zamiast go pominąć. Opcjonalność i „może być undefined” to naprawdę różne rzeczy, a testy dokładnej równości je rozróżniają.

    Linia po linii

    1. { [K in keyof T]?: T[K] }

      Znak `?` to modyfikator typu mapowanego. Stoi między klauzulą klucza a dwukropkiem i dodaje opcjonalność każdemu wytworzonemu kluczowi.

    2. keyof T

      Mapowanie po `keyof T`, a nie po podanym zbiorze kluczy, sprawia, że dotyczy to całego obiektu. Porównaj z `Pick`, gdzie zbiór kluczy jest argumentem.

    Do zapamiętania

    Modyfikatory (`?` i `readonly`) doczepiają się do mapowania, nie do wartości. `-?` i `-readonly` je zdejmują — tak właśnie napisany jest `Required`.

    Wykorzystuje