Kształty obiektów
Omit
Usuwa wymienione klucze — i w odróżnieniu od `Pick` nie dba o to, czy w ogóle istniały.
Czym jest
Nie jest prymitywem: `Omit` to `Pick<T, Exclude<keyof T, K>>`, co definicja obok pokazuje wprost. Ograniczeniem jest `keyof any`, a nie `keyof T`, i ta jedna różnica odpowiada za większość błędów z udziałem tego typu.
Przykłady
Omit<{ a: string; b: number }, 'b'>→{ a: string; }Omit<{ a: string }, 'typo'>→{ a: string; }Żadnego błędu, żadnego skutku. Źle wpisany klucz po cichu nic nie usuwa, a typ nadal wygląda dobrze.
Omit<{ a: string; b: number; c: boolean }, 'a' | 'b'>→{ c: boolean; }
Każdy rozwinięty typ powyżej wypisał TypeScript 5.9.3, nie ręka człowieka.
Czego nie robi
- Nie sprawdza przekazywanych kluczy. `Omit<User, "nmae">` kompiluje się, nic nie usuwa i jest najczęstszym cichym błędem w bazach kodu TypeScriptu.
- Nie dystrybuuje się po uniach, więc usuwanie z `A | B` najpierw zapada się do wspólnych kluczy, a dopiero potem cokolwiek usuwa.
Wniosek
Jeśli chcesz łapać literówki, napisz własne: `type StrictOmit<T, K extends keyof T> = Omit<T, K>`. Całą naprawą jest ograniczenie.