Wzorce
Jak powstrzymać Omit<User, "nmae"> przed cichym sukcesem, który nic nie usuwa?
Wbudowany ogranicza parametr klucza do keyof any, czyli do każdego klucza, jaki mógłby istnieć. Ogranicz go zamiast tego do keyof T.
Przepis
type StrictOmit<T, K extends keyof T> = Omit<T, K> type User = { id: number; name: string; email: string } type WithoutEmail = StrictOmit<User, 'email'>
Build to kompiluje i sprawdza każdy wynik poniżej.
Jak to działa
- 01
type StrictOmit<T, K extends keyof T> = Omit<T, K>Cały przepis. Ciało wciąż deleguje do wbudowanego — węższe są tylko drzwi, a to w drzwiach był błąd.
Co dostajesz
WithoutEmail→{ id: number; name: string; }StrictOmit<User, 'id' | 'name'>→{ email: string; }Omit<User, 'nmae'>→{ email: string; id: number; name: string; }Wbudowany, dla porównania: żadnego błędu, nic nie usunięte, a typ nadal wygląda wiarygodnie. To właśnie ten błąd ogranicza ograniczenie.
Gdzie to zawodzi
Jest surowszy od wbudowanego w sposób, który czasem gryzie: Omit jest celowo pobłażliwy, by dało się go użyć na uniach i na typach o jeszcze nieznanych kluczach. Globalna podmiana ujawni realny kod, który na tym polegał.
Wniosek
Jedna linia, a usuwa całą klasę cichych błędów. Umieść ją w tym samym pliku co inne wspólne typy i już nigdy nie pisz gołego Omit.

