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`.