Przejdź do treści
webtype.orgwebtype.org

    ↑↓ ruch · ⏎ otwórz · esc zamknij

    Nr 249 · 1 września 2026 · Średnia

    Opcjonalne, ale tylko te

    Zaimplementuj PartialBy<T, K>, aby opcjonalne stały się wyłącznie właściwości wymienione w K. Wynik ma być jednym płaskim typem obiektu, nie przecięciem. Flatten jest dostarczony.

    01

    Spróbuj rozwiązać samodzielnie

    Par 3

    Zagadka

    partial-by-keys.ts
    type Flatten<T> = { [K in keyof T]: T[K] }
    Podejście 1 z 3Jeszcze nie sprawdzone

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

    Testy

    3
    • PartialBy<{ a: string; b: number }, 'b'>—
      → { a: string; b?: number }
    • PartialBy<{ a: string; b: number }, 'a' | 'b'>—
      → { a?: string; b?: number }
    • PartialBy<{ a: string }, never>—
      → { 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 2 września 2026

    Rozwiązanie

    type PartialBy<T, K extends keyof T> = Flatten<Omit<T, K> & Partial<Pick<T, K>>>

    Najczęstsza błędna odpowiedź

    type PartialBy<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>

    Wszystko tu się zgadza poza kształtem. { a: string } & { b?: number } przyjmuje i odrzuca dokładnie te same wartości co { a: string; b?: number }, ale to nie ten sam *typ*, a Equal porównuje typy, nie zachowanie. Przecięcie to dwa obiekty stojące obok siebie; sprawdzenie prosi o jeden.

    Linia po linii

    1. Omit<T, K> & Partial<Pick<T, K>>

      Podziel obiekt na dwie części: klucze, które zostają bez zmian, i klucze, które stają się opcjonalne. Każda połowa z osobna jest łatwa.

    2. Flatten<...>

      Homomorficzne mapowanie po przecięciu przechodzi każdy klucz raz i odbudowuje jeden obiekt — a że jest homomorficzne, ? przeżywa tę podróż.

    Do zapamiętania

    Przecięcia służą do składania typu obiektu; homomorficzne mapowanie służy do jego wykończenia. Złożenie bez wykończenia to najczęstszy powód, dla którego poprawnie wyglądające rozwiązanie nie przechodzi tych sprawdzeń.

    Wykorzystuje