Przejdź do treści
webtype.orgwebtype.org

    ↑↓ ruch · ⏎ otwórz · esc zamknij

    Nr 235 · 18 sierpnia 2026 · Średnia

    WybierzPoTypie

    Zaimplementuj PickByType<T, U>, aby zachował tylko właściwości, których typ wartości jest przypisywalny do U. Odrzucone klucze muszą zniknąć całkowicie, a nie zostać jako never.

    01

    Spróbuj rozwiązać samodzielnie

    Par 3

    Zagadka

    pick-by-type.ts
    interface Mixed {
      id: number
      name: string
      active: boolean
      score: number
    }
    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

    4
    • PickByType<Mixed, number>—
      → { id: number; score: number }
    • PickByType<Mixed, string>—
      → { name: string }
    • PickByType<Mixed, symbol>—
      → {}
    • PickByType<{ a: string }, 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 19 sierpnia 2026

    Rozwiązanie

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

    Najczęstsza błędna odpowiedź

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

    Filtrowanie zachodzi po stronie wartości, więc każdy klucz przeżywa — odrzucone trzymają po prostu never. PickByType<Mixed, number> daje { id: number; name: never; active: never; score: number }, co jest zupełnie innym typem niż żądany i w praktyce bezużytecznym.

    Linia po linii

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

      Klauzula as przepisuje każdy klucz w trakcie mapowania. Tutaj przepisanie jest warunkowe: zachowaj klucz bez zmian, gdy wartość pasuje, albo przemianuj go na never, gdy nie pasuje.

    2. never

      Klucz typu never nie może istnieć, więc TypeScript pomija właściwość, zamiast tworzyć niemożliwą. Ta cicha reguła zamienia przemianowywanie kluczy w filtr.

    Do zapamiętania

    Filtrowanie typu obiektowego zachodzi w klauzuli klucza, nigdy w wartości. as ... : never to jedyny sposób, by właściwość naprawdę zniknęła.

    Wykorzystuje