Przejdź do treści
webtype.org#251 deep-partial · par 4

    ↑↓ ruch · ⏎ otwórz · esc zamknij

    Nr 251 · 3 września 2026 · Trudna

    Opcjonalne aż do dna

    Zaimplementuj `DeepPartial<T>`, aby każda właściwość była opcjonalna na każdym poziomie zagnieżdżenia, nie tylko na najwyższym.

    01

    Spróbuj rozwiązać samodzielnie

    Par 4

    Zagadka

    deep-partial.ts
    Podejście 1 z 4Jeszcze nie sprawdzone

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

    Testy

    3
    • DeepPartial<{ a: { b: string } }>
      { a?: { b?: string } }
    • DeepPartial<{ x: number }>
      { x?: number }
    • DeepPartial<{ a: { b: { c: 1 } } }>
      { a?: { b?: { c?: 1 } } }

    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 4 września 2026

    Rozwiązanie

    type DeepPartial<T> = { [K in keyof T]?: T[K] extends object ? DeepPartial<T[K]> : T[K] }

    Najczęstsza błędna odpowiedź

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

    To jest `Partial` i zatrzymuje się na pierwszym poziomie. `{ a: { b: string } }` staje się `{ a?: { b: string } }` — zewnętrzny klucz jest opcjonalny, a `b` pozostaje tak samo wymagane jak było. Głębokość nie bierze się sama z siebie; typ musi o nią poprosić.

    Linia po linii

    1. T[K] extends object ? DeepPartial<T[K]> : T[K]

      Rekurencja mieszka w klauzuli wartości. Wszystko, co ma kształt obiektu, wraca przez `DeepPartial`; prymitywy zwracane są nietknięte i to właśnie kończy schodzenie w głąb.

    2. [K in keyof T]?:

      `?` trafia na każdy poziom, bo każdy poziom to kolejne wywołanie tego samego typu mapowanego. Jedna reguła, napisana raz, zastosowana aż do dna.

    Do zapamiętania

    Rekurencyjny typ mapowany to po prostu typ mapowany, który wywołuje sam siebie w pozycji wartości. Warunek, który go zatrzymuje — tutaj „czy to wciąż obiekt?” — znaczy więcej niż sama rekurencja.

    Wykorzystuje