Este artículo está publicado en inglés.
TypeScript 6's Bridge Role in the Path to a Native TS 7 Compiler
Learn how TypeScript 6 updates default configs, module resolution, and import syntax to prepare codebases for the faster, Go-based TypeScript 7 compiler.
Cualquier desarrollador que mantenga una base de código significativa en TypeScript reconoce esa demora tan familiar. Al guardar el archivo, el editor se detiene unos segundos mientras el servidor de lenguaje se pone al día. En los pipelines de CI, las solicitudes de pull request se acumulan porque la verificación de tipos por sí sola puede tardar de cinco a diez minutos en completarse.
Desarrollador guarda archivo ──> [ tsc basado en JS: Procesamiento en hilo único ] ──> Retroalimentación lenta
Desarrollador guarda archivo ──> [ Motor nativo de TS 7: Hilos paralelos ] ──> Retroalimentación instantánea
TypeScript 7 introduce un compilador nativo desarrollado en Go. Este procesa las tareas a través de múltiples hilos y reduce los tiempos de compilación entre 8 y 10 veces. Pero no se puede simplemente incorporar un compilador nativo multihilo en un proyecto que aún depende de opciones de configuración heredadas de 2018.
Ese es el propósito de TypeScript 6: funciona como punto de transición. Elimina la deuda técnica obsoleta, actualiza las configuraciones predeterminadas desactualizadas y se asegura de que su proyecto se compile sin problemas una vez llegue TypeScript 7.
¿Por qué necesita TypeScript una versión de puente?
Durante más de diez años, el propio compilador de TypeScript estuvo escrito en TypeScript y funcionaba en Node.js. Esto facilitó que los desarrolladores de JavaScript contribuyeran directamente al código del compilador.
El problema es que la ejecución de JavaScript es single-threaded. A medida que los repositorios de código crecieron hasta convertirse en monorepos masivos con millones de líneas, el compilador eventualmente llegó a un techo de rendimiento insuperable.
TypeScript 7 aborda esto ejecutando código máquina nativo en paralelo a través de varios núcleos de CPU. Sin embargo, un compilador paralelizado introduce dos requisitos de comportamiento que antes no eran importantes:
- Orden determinista: Incluso cuando varios núcleos evalúan tipos simultáneamente, el compilador debe garantizar que los errores reportados y los tipos inferidos siempre se generen en una secuencia consistente y reproducible.
- Alineación con estándares modernos: Seguir soportando sistemas de módulos obsoletos desde hace décadas como AMD, o estrategias de resolución desactualizadas, añade complejidad y sobrecarga innecesarias a un compilador nativo.
TypeScript 6 marca el punto en el que el equipo aplica estas expectativas. Impulsa a los desarrolladores hacia las convenciones actuales de ECMAScript para que el salto posterior a la versión 7 no cause interrupciones.
Los mayores cambios de configuración en tsconfig.json
La mayoría de los cambios visibles introducidos en TypeScript 6 se encuentran dentro de tu tsconfig.json. Varios valores predeterminados antiguos han sido actualizados para reflejar cómo se construyen realmente los proyectos en la actualidad.
1. strict: true es ahora el valor predeterminado
Anteriormente, un archivo tsconfig.json vacío significaba que TypeScript operaba en modo permisivo, a menos que se activara manualmente con "strict": true.
A partir de TypeScript 6, el modo estricto se activa automáticamente.
// tsconfig.json
{
"compilerOptions": {
// Esto está activo por defecto en TypeScript 6
"strict": true
}
}
Si su proyecto ya tenía configurado strict: true, no cambiará nada para usted. Pero si su código dependía de tipos implícitos any o de valores null y undefined sin protección, la actualización mostrará errores de tipo de inmediato.
Por qué es importante:
Un verificador de tipos nativo funciona con mayor eficiencia cuando la información de tipo es explícita y consistente. El tipado flexible obliga al compilador a manejar escenarios impredecibles, lo que ralentiza el análisis estático.
2. El destino por defecto de los módulos es esnext
Históricamente, TypeScript utilizaba como objetivo de salida versiones antiguas como ES3 o ES5. En la práctica, casi todos los entornos de ejecución que se usan en producción hoy en día son “evergreen”: Node.js, Bun, Deno y los navegadores modernos admiten módulos ECMAScript nativos.
Con TypeScript 6, la opción predeterminada de module es ahora esnext, y el valor predeterminado de target apunta a una versión actual de ECMAScript.
// Configuración moderna recomendada
{
"compilerOptions": {
"module": "esnext",
"moduleResolution": "bundler", // o "nodenext"
"target": "es2024">
}
}
Si su aplicación aún necesita un formato de salida CommonJS para compatibilidad con entornos de servidor antiguos, puede establecer manualmente "module": "commonjs". TypeScript ya no asume automáticamente un formato de salida obsoleto a menos que usted lo solicite.
Límites de módulos más claros: Adiós a los trucos con baseUrl
Antes era común que los equipos configuraran alias de rutas de esta manera:
// Patrón antiguo en tsconfig.json
{
"compilerOptions": {
"baseUrl": "./",
"paths": {
"@components/*": ["src/components/*"],
"@services/*": ["src/services/*"]
}
}
}
Las versiones anteriores de TypeScript requerían que estuviera presente baseUrl para poder resolver las asignaciones de paths. Ese requisito causaba problemas, ya que baseUrl también permitía a los desarrolladores escribir importaciones sin un prefijo relativo, como import { Button } from "src/components/Button", lo que dificultaba distinguir los archivos locales del proyecto de los paquetes obtenidos desde npm.
TypeScript 6 elimina esa dependencia: paths ahora puede funcionar por sí solo, sin necesidad de declarar baseUrl. Además, TypeScript 6 añade soporte nativo para las importaciones de subrutas en Node.js, la convención que utiliza un prefijo #.
Uso de importaciones nativas de subrutas
En lugar de depender del mecanismo de alias específico de TypeScript, los proyectos actuales pueden utilizar el campo estándar imports dentro de package.json:
// package.json
{
"name": "my-app",
"imports": {
"#services/*": "./src/services/*.js",
"#utils/*": "./src/utils/*.js"
}
}
Desde sus archivos de origen, se hacen referencias a estas subrutas utilizando la sintaxis estándar #:
// src/api/user.ts
import { db } from "#services/database";
import { formatName } from "#utils/string";
export function getUser(id: string) {
const user = db.find(id);
return formatName(user.name);
}
Dado que este mecanismo es comprendido por Node.js en sí mismo y no requiere reescritura del lado del compilador, la resolución de archivos se vuelve notablemente más rápida tanto en TypeScript 6 como en el próximo TypeScript 7.
Sintaxis de módulo literal y importaciones solo de tipo
Un problema frecuente en los conjuntos de código que mezclan código en tiempo de ejecución y declaraciones de tipos es que las importaciones que contienen solo tipos pueden ser tratadas accidentalmente como importaciones reales y ejecutables. Cuando se incluye una interfaz mediante una declaración import ordinaria, cualquier herramienta que lea ese archivo debe determinar por sí misma si la importación contiene lógica real de JavaScript o únicamente información de tipo en tiempo de compilación.
TypeScript 6 incentiva a los equipos a habilitar verbatimModuleSyntax:
// tsconfig.json
{
"compilerOptions": {
"verbatimModuleSyntax": true
}
}
Al activar esta opción, la regla se vuelve inequívoca: todo lo que sea puramente un tipo debe importarse con la palabra clave import type.
// ANTES: El compilador tenía que verificar si User y Order contenían código en tiempo de ejecución
import { User, Order, calculateTotal } from "./billing";
// DESPUÉS: Es explícito y predecible tanto para los compiladores como para los bundlers
import { calculateTotal } from "./billing";
import type { User, Order } from "./billing";
¿Por qué es importante esto para TypeScript 7?
El compilador multi-núcleo y paralelizado que se está desarrollando intenta procesar los archivos de forma aislada siempre que es posible. Una instrucción import type le indica de inmediato que nada en ese archivo generará JavaScript, por lo que puede omitir la apertura y análisis de ./billing.ts solo para determinar las reglas de emisión del archivo actual. Esta pequeña disciplina contribuye a reducir significativamente la carga de compilación en grandes bases de código.
Nuevas características ergonómicas del lenguaje integrado
Más allá de los valores predeterminados de configuración, TypeScript 6 introduce varias comodidades cotidianas que facilitan la escritura de patrones de código comunes.
1. Map.getOrInsert() y Map.getOrInsertComputed()
Piense en cuántas veces ha tenido que escribir este tipo de lógica repetitiva para buscar en la caché:
// El método antiguo y repetitivo
const userCache = new Map<string, UserProfile>>();
function getProfile(userId: string): UserProfile {
let profile = userCache.get(userId);
if (!profile) {
profile = fetchProfileFromDatabase(userId);
userCache.set(userId, profile);
}
return profile;
}
TypeScript 6 admite el método getOrInsertComputed propuesto por TC39, lo que permite reemplazar ese patrón por:
// La forma moderna de TypeScript 6
const userCache = new Map<string, UserProfile>>();
function getProfile(userId: string): UserProfile {
// Solo se ejecuta la función de callback si la clave aún no existe
return userCache.getOrInsertComputed(userId, () => {
return fetchProfileFromDatabase(userId);
});
}
Esta versión es más compacta, evita la necesidad de una variable temporal mutable y mantiene la inferencia de tipos precisa en todo momento.
2. Tipos integrados para RegExp.escape()
Sanitizar caracteres especiales antes de incluirlos en una expresión regular solía requerir crear un helper propio o utilizar un paquete de terceros. TypeScript 6 ahora incluye definiciones de tipo integradas para RegExp.escape():
const userInput = "item.value [test]";
// Escapa de forma segura caracteres como '.', '[', y ']'
const safePattern = RegExp.escape(userInput);
const regex = new RegExp(`^${safePattern}
Operator Software for Solar, BESS & Video | REACTAPP.TOP
TypeScript 6's Bridge Role in the Path to a Native TS 7 Compiler
);
Con esto en su lugar, se evitan todo tipo de errores por inyección de expresiones regulares sin tener que agregar ni una sola dependencia al proyecto.
Preparación para el orden determinista de tipos
Una adición más sutil pero importante en TypeScript 6 es la bandera stableTypeOrdering.
Hasta TypeScript 5.x, el orden en que aparecían los miembros de un tipo union dependía de la secuencia en que el compilador procesaba los archivos en memoria. Dado que la compilación se realizaba en un único hilo, ese orden solía mantenerse consistente de una ejecución a otra.
No obstante, una vez que se pase a un compilador paralelizado como el previsto para TypeScript 7, los hilos de trabajo pueden completar su tarea asignada en un orden diferente cada vez. Si un hilo termina antes que otro, una unión podría resultar como string | number; si se vuelve a ejecutar la compilación o se hace en una máquina diferente, es posible obtener number | string en su lugar.
Para evitar que los archivos .d.ts generados cambien de forma impredecible, TypeScript 7 aplica internamente una regla de ordenamiento estricta y determinista. Ahora, TypeScript 6 también permite optar por ese mismo comportamiento:
// tsconfig.json
{
"compilerOptions": {
"stableTypeOrdering": true
}
}
Si su trabajo implica mantener paquetes de código abierto o guardar archivos de declaración generados en un sistema de control de versiones, vale la pena activar esta opción y probarla hoy mismo. Al hacerlo, se garantiza que sus pruebas de captura y los tipos generados no produzcan diferencias sin sentido una vez que finalmente pase a utilizar TypeScript 7.
Lista de verificación práctica para la migración
Mover una base de código considerable hacia adelante no tiene por qué ser doloroso si se aborda en etapas. Tenga en cuenta estas prioridades:
Revise primero todas las banderas relacionadas con strict, ya que esta es su mejor defensa contra valores implícitos de any y referencias no protegidas a null que puedan pasar desapercibidas antes de la llegada de la versión 7; alta prioridad.
Elimine las configuraciones obsoletas de módulos, abandonando AMD, UMD y la estrategia heredada de resolución de módulos de node; alta prioridad.
Active verbatimModuleSyntax para que la generación de JavaScript ya no dependa en absoluto del verificador de tipos; prioridad media.
Adopte importaciones por subruta utilizando el prefijo #, lo que elimina la necesidad de soluciones temporales específicas del bundler para la resolución de rutas; prioridad media.
Establezca rootDir de forma explícita para evitar sorpresas en la estructura de su carpeta de salida cuando se ejecuten compilaciones en paralelo; baja prioridad.
Errores comunes que deben evitarse
Error 1: Desactivar el modo estricto para solucionar errores de actualización
Una reacción común tras actualizar a TypeScript 6 y encontrarse con una ola de nuevos errores es simplemente establecer "strict": false para que la integración continua vuelva a funcionar.
Esa solución podría liberarte a corto plazo, pero solo pospone el trabajo real. Las mejoras de rendimiento en TypeScript 7 se basan en la presunción de un tipado sólido. En lugar de desactivar completamente el modo estricto, desactiva temporalmente las verificaciones individuales —por ejemplo, "noImplicitAny": false— y corrige los errores resultantes de forma gradual, archivo por archivo.
Error 2: Mezclar importaciones de tiempo de ejecución y de tipos
No combines importaciones de tipos y valores en una sola declaración una vez que se active verbatimModuleSyntax:
// Evitar
import { User, UserService } from "./userService";
// Preferir
import { UserService } from "./userService";
import type { User } from "./userService";
Mantenerlos separados evita ambigüedades, tanto para los lectores como para el compilador, respecto a cuáles importaciones sirven únicamente para la verificación de tipos y cuáles contienen código real que se ejecuta en tiempo de ejecución.
El panorama general: ¿Qué sucede a continuación?
TypeScript 6 no pretende imponerte un montón de nuevas sintaxis que aprender. Su verdadero propósito es estabilizar la base antes de un cambio mucho más significativo.
Al actualizar ahora su tsconfig.json, pasar a importaciones explícitas de tipo único y eliminar el manejo de rutas de estilo antiguo, elimina la gran mayoría de las dificultades a las que de lo contrario se enfrentaría más adelante. Una vez esté disponible TypeScript 7, la actualización debería consistir únicamente en elevar la versión del paquete y ejecutar el nuevo compilador nativo, con tiempos de compilación que bajan a menos de un segundo y sin necesidad de reescribir su código existente.
Dedique un breve período de tiempo esta semana para revisar la configuración de su proyecto. Es una pequeña inversión que tendrá un gran retorno a largo plazo.
¿Cuál es su plan para la actualización?
¿Su equipo ya está trabajando con el modo estricto completamente activado, o todavía está resolviendo opciones de configuración antiguas? ¿Ha comenzado a experimentar con importaciones de subrutas en sus propios proyectos? Comparta sus opiniones y preguntas en los comentarios.
Lecturas relacionadas
- Migrar APIs de Express a los controladores de rutas del App Router de Next.js — Aprenda cómo convertir rutas, middleware y patrones de datos de Express a Next.js App Router con componentes server-side y consideraciones de despliegue.
- Hacer que el reclasificado se gané su lugar en su pipeline RAG — Una segunda etapa de clasificación debe agregar información útil, preservar las pruebas y mostrar mejoras medibles en comparación con una base de solo recuperación.
Sustituyendo Jest por el ejecutor de pruebas nativo de Node en Node 24 — Una migración real muestra cómo el ejecutor de pruebas integrado en Node 24 y el soporte nativo para TypeScript reducen el tiempo de CI al mismo tiempo que eliminan cuatro dependencias. Comparación de los agentes de IA Frontier: Astra, Flash, Fable y Mythos — Un análisis detallado del rendimiento de las últimas versiones de los modelos GPT, Gemini y Claude en tareas reales de agencia como programación, navegación y uso de herramientas, más allá de las pruebas de rendimiento estándar. La reescritura en Go de TypeScript 7: qué implica para la seguridad de tipos en React — Aprenda cómo el compilador basado en Go de TypeScript 7 acelera los procesos de compilación y mejora la inferencia genérica, eliminando los tipos any ocultos en los hooks y JSX de React. El compilador en Go de TypeScript y la ejecución nativa: una guía de migración — Entienda cómo el compilador basado en Go de TypeScript y la ejecución nativa en Node.js afectarán los proyectos React y Next.js, y qué debe corregir ahora en su tsconfig.