Patrones
¿Cómo evito que `Omit<User, "nmae">` tenga éxito en silencio y no quite nada?
El integrado restringe su parámetro de clave a `keyof any`, que es toda clave que pudiera existir. Restríngelo a `keyof T` en su lugar.
La receta
type StrictOmit<T, K extends keyof T> = Omit<T, K> type User = { id: number; name: string; email: string } type WithoutEmail = StrictOmit<User, 'email'>
La compilación compila esto y comprueba cada resultado de abajo.
Cómo funciona
- 01
type StrictOmit<T, K extends keyof T> = Omit<T, K>
Toda la receta. El cuerpo sigue delegando en el integrado — solo la puerta es más estrecha, y la puerta era donde estaba el fallo.
Lo que obtienes
WithoutEmail
→{ id: number; name: string; }StrictOmit<User, 'id' | 'name'>
→{ email: string; }Omit<User, 'nmae'>→{ email: string; id: number; name: string; }El integrado, para comparar: ningún error, nada eliminado, y un tipo que sigue pareciendo plausible. Este es el fallo que la restricción evita.
Dónde falla
Es más estricto que el integrado de un modo que a veces muerde: `Omit` es deliberadamente permisivo para poder usarse sobre uniones y sobre tipos cuyas claves aún no se conocen. Cambiarlo globalmente sacará a la luz código real que dependía de eso.
Conclusión
Una línea, y elimina toda una clase de fallo silencioso. Ponla en el mismo archivo que tus otros tipos compartidos y no vuelvas a escribir `Omit` a secas.