ProgramaciónDesarrollador Frontend / Desarrollador Fullstack

¿Cómo funciona el sistema de inferencia de tipos en TypeScript? ¿Cuáles son los niveles de inferencia de tipos y qué errores se pueden cometer al confiar en la 'inteligencia' del compilador?

Supere entrevistas con el asistente de IA Hintsage

Respuesta

TypeScript cuenta con un potente sistema de inferencia de tipos. En la mayoría de los casos, los tipos de las variables, parámetros y valores de retorno se calculan automáticamente según el contexto. Hay varios niveles de inferencia de tipos:

  • Inferencia simple: al declarar variables sin un tipo explícito.
  • Inferencia contextual: cuando el tipo de una expresión se determina por el contexto (por ejemplo, un manejador de eventos).
  • Mejor tipo común: para arrays con elementos de diferentes tipos, se busca el más común.

Ejemplos:

let a = 2; // number let b = [1, "a"]; // (number | string)[] window.addEventListener('click', e => { // e: MouseEvent });

Restricción: si el compilador no puede inferir el tipo de manera clara, elegirá el más amplio (generalmente any), lo que elimina las ventajas de la tipificación.

Pregunta engañosa

¿Se tipifica el argumento de una función si no se especifica explícitamente, pero la función se utiliza más adelante con un valor tipificado?

Respuesta incorrecta: Sí, TypeScript siempre "adivinará" automáticamente el tipo del argumento.

Respuesta correcta: No. Solo si el contexto de la función contiene información sobre el tipo, el argumento obtendrá un tipo. De lo contrario, será any u otro tipo base, lo que llevará a errores. Siempre es recomendable tipificar explícitamente los datos de entrada.

Ejemplo:

function f(x) { return x.toFixed(2); // Error: x es del tipo any }

Ejemplos de errores reales debido al desconocimiento de los matices del tema


Historia

En un proyecto no se especificó explícitamente el tipo de retorno de un hook personalizado de React, y TypeScript no vio que el tipo podía ser undefined. Como resultado, la llamada a un método del objeto sin comprobación llevó a errores en tiempo de ejecución.


Historia

Al crear un array de valores de tipo mixto, el tipo final se inferió automáticamente como un array any[] porque no se había especificado un tipo explícitamente, lo que llevó a la pérdida de todas las ventajas de la tipificación en el código siguiente.


Historia

La validación de los parámetros de entrada del servicio no estaba tipificada y se basaba en la "adivinanza" de TypeScript. Después de refactorizar el codebase, la inferencia automática dio un tipo demasiado general, y los errores de tipos de datos llegaron a producción.