TypeScript implementa el mecanismo de comprobación de propiedades excedentes (Excess Property Checking) para mayor seguridad, a fin de advertir al programador sobre errores en las declaraciones de objetos cuando se asigna directamente un literal de objeto a una variable con tipo. Este mecanismo surgió debido a que la tipificación estructural de TypeScript podía permitir propiedades adicionales no declaradas, lo que a menudo conduce a errores en la lógica del programa, especialmente al trabajar con API o formularios.
Las comprobaciones de propiedades excedentes se introdujeron para mejorar la seguridad en el desarrollo frontend, donde la estructura de los objetos a menudo sigue un modelo de contrato estricto (por ejemplo, para la serialización en JSON). Cuando un objeto se crea como literal y se pasa inmediatamente a una función o se almacena en una variable de un tipo específico, TS realiza una comprobación "excedente": busca propiedades extra que no están descritas en el tipo esperado.
Un error del programador puede pasar desapercibido si el objeto contiene un error tipográfico o una propiedad adicional, y dicha propiedad puede no ser utilizada correctamente o quedar completamente oculta de la lógica de negocio. Además, las Comprobaciones de Propiedades Excedentes pueden activarse inesperadamente, por ejemplo, si el objeto no está tipado explícitamente o se maneja mediante operadores de propagación o a través de variables intermedias.
TypeScript aplica Comprobaciones de Propiedades Excedentes a literales de objetos que se asignan directamente a una variable o parámetro de función. La comprobación busca todas las propiedades del objeto y las compara con el tipo declarado: si hay propiedades adicionales, se producirá un error de compilación.
interface UserProfile { name: string; age: number; } const user: UserProfile = { name: "Sam", age: 25, email: "sam@mail.com" // Error: propiedad extra email };
Para evitar la comprobación excedente, por ejemplo, para objetos con propiedades dinámicas o tipificación parcial, se utilizan firmas de índice o variables intermedias.
interface FlexibleUser { name: string; [prop: string]: any; // La firma de índice permite cualquier nueva propiedad } const user2: FlexibleUser = { name: "Sam", age: 25, email: "sam@mail.com" // Funciona correctamente };
Características clave:
Si se crea un objeto con una propiedad extra, se le asigna a una variable sin tipo, y luego se vuelve a asignar el tipo, ¿se activarán las Comprobaciones de Propiedades Excedentes?
No, la comprobación excedente solo funciona en la asignación directa de un literal. Si el objeto se crea de antemano y luego solo se especifica el tipo, las propiedades adicionales no se detectan.
const temp = { name: "John", age: 18, foo: "bar" }; const u: UserProfile = temp; // No hay error, foo se ignora
¿Funcionan las Comprobaciones de Propiedades Excedentes para clases y objetos de clase?
No, esta comprobación no se realiza en clases y objetos de clase, solo para literales de objetos.
¿Se puede deshabilitar globalmente las comprobaciones excedentes en la configuración de TS?
No, no hay una configuración separada para desactivarla. Sin embargo, se puede establecer una firma de índice para las propiedades o usar el operador de afirmación de tipo ('as') para indicar explícitamente que la comprobación no es necesaria.
const special: UserProfile = { name: "Max", age: 22, hobby: "js" } as UserProfile;
Un desarrollador crea una interfaz para un formulario de usuario, permitiendo todas las propiedades a través de [key: string]: any, para evitar errores con campos adicionales.
Pros: No hay errores de compilación con datos dinámicos.
Contras: Cualquier error en la estructura del formulario o errores tipográficos no se detectan, es difícil encontrar errores.
Un desarrollador define una interfaz estricta y utiliza una función separada para transformar datos dinámicos a una estructura estricta, con validación previa.
Pros: La interfaz siempre coincide con el contrato esperado, el compilador detecta errores tipográficos, alta mantenibilidad.
Contras: Se necesita escribir código adicional para la comprobación y el mapeo de datos dinámicos.