Introducción: ¿Por qué TypeScript puede ser lento?
TypeScript es una herramienta potente que añade tipificación estática a JavaScript. Sin embargo, los desarrolladores a menudo se encuentran con que las aplicaciones TypeScript "de fábrica" funcionan más lento que el JS puro. Las razones principales son la transpilación excesiva, la configuración incorrecta del compilador y los patrones de código no óptimos. En este artículo analizaremos métodos prácticos de optimización que ayudarán a acelerar tanto el proceso de compilación como el tiempo de ejecución de su aplicación.
1. Perfilado y búsqueda de cuellos de botella
Antes de optimizar algo, hay que entender qué es lo que ralentiza. Utilice las herramientas integradas del navegador y Node.js.
1.1. Rendimiento de Chrome DevTools
Grabe un perfil de ejecución de la aplicación. Preste atención a las tareas largas (Long Tasks) y a las llamadas frecuentes al recolector de basura (GC). El código TypeScript después de la compilación es JavaScript normal, por lo que todos los métodos estándar de perfilado funcionan.
1.2. Análisis del tiempo de compilación (tsc --generateTrace)
Si la compilación en sí es lenta, use la bandera --generateTrace:
tsc --generateTrace trace_outputLuego abra el archivo trace_output/trace.json en Chrome en la dirección chrome://tracing. Verá qué archivos tardan más en compilarse. A menudo son bibliotecas grandes o archivos con importaciones redundantes.
2. Configuración de tsconfig.json para máxima velocidad
Una configuración incorrecta es el principal enemigo del rendimiento. Veamos las opciones clave.
2.1. strict: true — no se apresure
El modo strict activa todas las comprobaciones de tipos estrictas. Esto ralentiza la compilación. Para la compilación de producción, use:
{ "compilerOptions": { "strict": false, "noImplicitAny": true, "strictNullChecks": true }}Estas dos opciones cubren el 90% de los errores, pero funcionan más rápido que el modo strict completo.
2.2. Opciones para acelerar la compilación
incremental: true— activa la compilación incremental. TypeScript guarda información sobre la compilación anterior y recompila solo los archivos modificados.skipLibCheck: true— desactiva la comprobación de tipos en los archivos de declaración (.d.ts). Esto proporciona un aumento significativo de velocidad, especialmente si se utilizan muchas bibliotecas de terceros.isolatedModules: true— permite el uso de transpiladores más rápidos (por ejemplo, esbuild) en lugar de tsc.
Ejemplo de configuración optimizada para desarrollo:
{ "compilerOptions": { "target": "ES2020", "module": "ESNext", "moduleResolution": "node", "incremental": true, "skipLibCheck": true, "strict": false, "noImplicitAny": true, "strictNullChecks": true, "outDir": "./dist" }, "include": ["src/**/*"], "exclude": ["node_modules", "**/*.test.ts"]}3. Optimización del tiempo de ejecución: tipos y estructuras de datos
Los tipos de TypeScript desaparecen después de la compilación, pero su "huella" permanece en forma de código generado por el compilador.
3.1. Evite tipos condicionales complejos en tiempo de ejecución
Los conditional types complejos pueden generar mucho código. En su lugar, use tipos unión simples:
// Malo: tipo condicional complejotype ResponseType<T> = T extends string ? { data: string } : { data: number };function handleResponse<T>(value: T): ResponseType<T> { ... }
// Bueno: unión simpletype ResponseType = { data: string } | { data: number };function handleResponse(value: string | number): ResponseType { ... }3.2. Use as const para constantes
Esto ayuda a TypeScript a inferir tipos más precisos, lo que reduce la cantidad de comprobaciones:
const COLORS = ['red', 'green',