TypeScript fue creado con un enfoque en el desarrollo seguro sin un exceso de tipos explícitos: la mayoría de los tipos de variables, parámetros y valores de retorno pueden ser inferidos automáticamente por el compilador. El sistema de inferencia de tipos permite escribir código casi como en JavaScript, pero manteniendo una tipificación estricta, lo que acelera significativamente el desarrollo y reduce la cantidad de errores.
La inferencia de tipos no siempre garantiza que se infiera el tipo que espera el desarrollador. Se dan situaciones en las que el tipo resulta ser demasiado amplio (any o unknown), o por el contrario, excesivamente estricto. Esto puede llevar a restricciones innecesarias o a la ausencia de verificación de tipos, lo que en ambos casos es inseguro.
TypeScript infiere automáticamente el tipo basado en la asignación o en el valor de retorno de la función, si el tipo no se ha especificado explícitamente. Se puede gestionar la inferencia mediante la especificación explícita del tipo, aserciones de tipo, generics y utilidades especiales (ReturnType, Parameters, etc.). Trabajar con estructuras complejas requiere un control particular: si el tipo es complejo o no evidente, es mejor especificarlo explícitamente.
Ejemplo de código:
let a = 5; // number (se infiere automáticamente) function sum(x = 4, y = 3) { // x: number, y: number return x + y; // return: number } // Error en la inferencia de tiposunction getData(flag) { if (flag) return 123; // no hay return en otra bifurcación — return type: number | undefined } // Mejor especificar explícitamente: function getData(flag: boolean): number | undefined { if (flag) return 123; }
Características clave:
True/False: La inferencia de tipos siempre da el tipo que espera el desarrollador
Falso. A veces, el tipo es más amplio o más estrecho, especialmente para arrays/objetos/valores de retorno de unión (number | undefined — una sorpresa común).
Si no se especifica un tipo en un objeto, TypeScript siempre mantendrá la estructura exacta
No, sin as const la estructura será "expandible" (widened), con as const será readonly con tipos literales.
const obj = { kind: "duck" }; // obj: { kind: string } const obj2 = { kind: "duck" } as const; // obj2: { readonly kind: "duck" }
Si no se especifica un tipo para un array, TS siempre conoce su composición
No, por defecto TypeScript hace que el array sea lo más "amplio" posible — por ejemplo, let arr = [1, 'a'] será (string | number)[], y no un tuple.
El backend devuelve un objeto de respuesta { data: [] }, el tipo no se especifica explícitamente, TypeScript infiere el tipo de data: any[]. En algún momento, data se convierte en un array de strings — el error solo aparece en producción.
Ventajas:
Desventajas:
En el proyecto se establece siempre especificar explícitamente el tipo de los valores de retorno de las funciones y estructuras complejas, utilizando as const para constantes. Cualquier modificación de la estructura se verifica por el compilador.
Ventajas:
Desventajas: