Rozwiązanie z komentarzem
Opublikowano 31 sierpnia 2026Rozwią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
as T[K] extends U ? never : KKlauzula
aszmienia nazwę produkowanego klucza. Zmiana naneverto jedyny sposób, by typ mapowany nie wyemitował w danym obrocie żadnej właściwości.OmitByType<{ a: 1; b: 2 }, never>Tutaj nic nie wypada, bo
1 extends neverjest fałszem.neverto 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.

