Przejdź do treści
webtype.orgwebtype.org

    ↑↓ ruch · ⏎ otwórz · esc zamknij

    Nr 247 · 30 sierpnia 2026 · Średnia

    Pomiń po typie

    Zaimplementuj OmitByType<T, U>, aby usuwał każdą właściwość T, której typ wartości daje się przypisać do U, a resztę zostawiał dokładnie taką, jaka była.

    01

    Spróbuj rozwiązać samodzielnie

    Par 3

    Zagadka

    omit-by-type.ts
    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
    • OmitByType<{ a: string; b: number; c: string }, string>—
      → { b: number }
    • OmitByType<{ a: string }, string | number>—
      → {}
    • OmitByType<{ a: 1; b: 2 }, never>—
      → { a: 1; b: 2 }

    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 31 sierpnia 2026

    Rozwiązanie

    type OmitByType<T, U> = { [K in keyof T as T[K] extends U ? never : K]: T[K] }

    Najczęstsza błędna odpowiedź

    type OmitByType<T, U> = { [K in keyof T]: T[K] extends U ? never : T[K] }

    To filtruje wartość, a klucz zostawia na miejscu. a wciąż tam jest, teraz z typem never — właściwość, dla której nikt nigdy nie poda wartości, co nie jest tym samym co właściwość nieistniejąca. Filtrowanie po stronie wartości potrafi opróżnić klucz, ale nie potrafi go usunąć.

    Linia po linii

    1. as T[K] extends U ? never : K

      Klauzula as zmienia nazwę produkowanego klucza. Zmiana na never to jedyny sposób, by typ mapowany nie wyemitował w danym obrocie żadnej właściwości.

    2. OmitByType<{ a: 1; b: 2 }, never>

      Tutaj nic nie wypada, bo 1 extends never jest fałszem. never to zbiór pusty: nic nie da się do niego przypisać, więc żaden klucz nie pasuje i wszystko przetrwa.

    Do zapamiętania

    Klucze usuwa się w klauzuli klucza, nigdy w klauzuli wartości. Jeśli produkujesz never jako typ właściwości, prawie na pewno chodziło ci o brak właściwości.

    Wykorzystuje