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.
type PickByType<T, U> = { [K inkeyof T as T[K] extends U ? K : never]: T[K]}
Najczęstsza błędna odpowiedź
type PickByType<T, U> = { [K inkeyof 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
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.
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.