ProgramaciónDesarrollador Frontend

Hable sobre el mecanismo de Comprobaciones de Propiedades Excedentes (Excess Property Checks) en TypeScript. ¿Cómo funcionan para los objetos, qué se verifica en la etapa de compilación y qué problemas pueden surgir al tipar objetos con propiedades dinámicas?

Supere entrevistas con el asistente de IA Hintsage

Respuesta.

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.

Contexto

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.

Problema

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.

Solución

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:

  • Las comprobaciones de propiedades excedentes se aplican solo a literales de objetos asignados a una variable tipificada explícitamente.
  • Se pueden evitar las comprobaciones utilizando firmas de índice o asignaciones a través de una variable intermedia.
  • Protege contra errores triviales y errores en la estructura de datos.

Preguntas trampa.

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;

Errores comunes y anti-patrones

  • Uso de la afirmación de tipo para desactivar la comprobación (puede llevar a errores no detectados en la estructura de objetos).
  • Uso injustificado de firmas de índice que socavan toda la rigurosidad de la descripción del tipo.

Ejemplo de la vida real

Caso negativo

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.

Caso positivo

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.