8 puntos por GN⁺ 2026-03-25 | 3 comentarios | Compartir por WhatsApp
  • Último lanzamiento basado en la base de código actual en JavaScript y versión puente para preparar la transición a TypeScript 7.0, el port nativo escrito en Go
  • Incluye mejoras en inferencia de tipos y resolución de módulos, como la reducción de sensibilidad al contexto para funciones que no usan this y soporte para subpath imports que comienzan con #/
  • Modernización importante de los valores predeterminados de opciones del compilador, como strict por defecto en true, target por defecto en es2025 y types por defecto en []
  • Desaprobación masiva de opciones legacy, como target ES5, módulos AMD/UMD/SystemJS, --baseUrl y --moduleResolution node10
  • Se añade soporte de tipos para propuestas modernas de ECMAScript Stage 4 como la API Temporal, getOrInsert/getOrInsertComputed de Map y RegExp.escape

La posición de TypeScript 6.0

  • Es el último lanzamiento basado en la base de código actual en JavaScript, y funciona como puente para la transición a TypeScript 7.0 (port nativo en Go)
  • TypeScript 7.0 aprovecha código nativo y multithreading con memoria compartida, y ya está muy cerca de estar terminado
  • La mayoría de los cambios de 6.0 están pensados para alinear y preparar la adopción de 7.0
  • TypeScript 7.0 ya puede probarse anticipadamente mediante la extensión de VS Code o el paquete npm

Cambios desde la Beta y la RC

  • Ajuste del type checking de expresiones de función en llamadas genéricas, especialmente en expresiones JSX genéricas — detecta más bugs en código existente, pero algunas llamadas genéricas podrían requerir argumentos de tipo explícitos
  • También se aplica en llamadas import() la extensión de la desaprobación de la sintaxis de import assertion (assert)
  • Actualización de tipos del DOM — refleja los estándares web más recientes, incluyendo ajustes relacionados con la API Temporal

Reducción de sensibilidad al contexto para funciones que no usan this

  • Durante la inferencia de tipos, TypeScript clasifica funciones con parámetros sin tipo explícito como funciones sensibles al contexto (contextually sensitive function) y las procesa con menor prioridad en el orden de inferencia
  • Las funciones escritas con sintaxis de método tenían un parámetro implícito this, por lo que a diferencia de las arrow functions siempre se trataban como sensibles al contexto
    • Esto provocaba casos en los que la inferencia de tipos fallaba según el orden de los métodos dentro de un objeto literal
  • En TypeScript 6.0, las funciones donde this no se usa realmente ya no se consideran sensibles al contexto
    • Estas funciones pasan a tener mayor prioridad en la inferencia de tipos, permitiendo inferencia correcta sin importar el orden de los métodos
  • Implementado gracias a una contribución de Mateusz Burzyński

Soporte para Subpath Imports que comienzan con #/

  • La funcionalidad de subpath imports de Node.js permite definir aliases para módulos internos de un paquete mediante el campo imports en package.json
  • Antes, era obligatorio que después de # hubiera un carácter, así que no se podían usar rutas que empezaran con #/
    • Esto causaba confusión entre desarrolladores acostumbrados a la convención de prefijo @/ en bundlers
  • Recientemente, Node.js empezó a soportar subpath imports que comienzan con #/
    • Ahora es posible un mapeo conciso como "#/*": "./dist/*"
  • TypeScript 6.0 lo soporta con las opciones --moduleResolution nodenext y bundler
  • Implementado gracias a una contribución de magic-akari

Se permite la combinación --moduleResolution bundler y --module commonjs

  • Antes, --moduleResolution bundler solo podía usarse con --module esnext o --module preserve
  • Debido a la desaprobación de --moduleResolution node (node10), esta nueva combinación es la ruta de actualización más adecuada para muchos proyectos
  • A largo plazo, se recomienda migrar a --module preserve + --moduleResolution bundler o a --module nodenext

Flag --stableTypeOrdering

  • Los type ID asignados internamente a los tipos en TypeScript dependen del orden de procesamiento, y en base a eso se ordenan los union types
    • Esto puede generar comportamientos impredecibles donde el resultado emitido de declaraciones cambia según el orden de declaración
  • TypeScript 7.0 introducirá type checking en paralelo, así que para resolver el problema de asignación no determinista de IDs usará un algoritmo de ordenamiento determinista basado en el contenido
    • Ejemplo: 100 | 500 siempre se emitirá en el mismo orden
  • Si se activa --stableTypeOrdering en 6.0, el comportamiento de ordenamiento de tipos coincide con el de 7.0, reduciendo diferencias entre ambas bases de código
    • Puede haber una caída de rendimiento de hasta 25% en type checking
    • Si aparecen errores de tipos por diferencias en inferencia, se puede resolver agregando argumentos de tipo explícitos o anotaciones de variables
  • Es un flag pensado solo para diagnosticar migraciones de 6.0 a 7.0; no se recomienda usarlo a largo plazo

Opción es2025 (target y lib)

  • ES2025 no trae nuevas funciones del lenguaje JavaScript, pero sí agrega tipos para APIs built-in como RegExp.escape
  • Promise.try, métodos de Iterator y métodos de Set que estaban en esnext pasan a es2025
  • Implementado gracias a una contribución de Kenta Moriuchi

Soporte de tipos para la API Temporal

  • TypeScript 6.0 incluye los tipos built-in de la propuesta Temporal, que ya llegó a Stage 4
  • Puede usarse con --target esnext o "lib": ["esnext"] (o bien con el granular esnext.temporal)
  • APIs como Temporal.Now.instant().subtract() y .add() pueden usarse con seguridad de tipos
  • Ya está disponible en varios runtimes y, al llegar a Stage 4, ya forma parte oficial del lenguaje JavaScript
  • Implementado gracias a una contribución de Renegade334

Soporte de tipos para los métodos “upsert” de Map (getOrInsert / getOrInsertComputed)

  • Simplifica el patrón repetitivo de verificar si existe una clave en un Map y, si no existe, establecer un valor predeterminado
  • La propuesta “upsert” de ECMAScript llegó a Stage 4 y agrega dos nuevos métodos a Map y WeakMap
    • getOrInsert: si la clave no existe, inserta y devuelve el valor predeterminado indicado
    • getOrInsertComputed: cuando crear el valor predeterminado es costoso, lo calcula de forma diferida mediante un callback
      • El callback recibe la clave como argumento, por lo que también sirve para generar valores predeterminados basados en la clave
  • Se añadió a esnext lib, así que puede usarse de inmediato en TypeScript 6.0
  • Implementado gracias a una contribución de Renegade334

RegExp.escape

  • La función RegExp.escape, que escapa caracteres especiales dentro de expresiones regulares, llegó a Stage 4
  • Está incluida en es2025 lib y puede usarse en TypeScript 6.0
  • Implementado gracias a una contribución de Kenta Moriuchi

Integración de dom.iterable y dom.asynciterable en dom lib

  • Antes, para usar iteración en NodeList, HTMLCollection, etc., había que declarar explícitamente "lib": ["dom", "dom.iterable"]
  • En TypeScript 6.0, el contenido de lib.dom.iterable.d.ts y lib.dom.asynciterable.d.ts queda integrado por completo en lib.dom.d.ts
    • dom.iterable y dom.asynciterable siguen pudiendo referenciarse, pero ahora son archivos vacíos
  • Como todos los navegadores modernos importantes soportan esta funcionalidad, es una mejora de conveniencia que elimina un punto común de confusión

Principales cambios en valores predeterminados

  • strict por defecto en true: como la mayoría de los proyectos nuevos quieren strict mode, los proyectos que dependían del false anterior deberán configurar explícitamente "strict": false
  • module por defecto en esnext: refleja que ESM se volvió el formato de módulos dominante
  • target por defecto en la versión más reciente de ES (actualmente es2025): con runtimes evergreen generalizados, ya no hace falta transpilar a versiones viejas
  • noUncheckedSideEffectImports por defecto en true: ayuda a detectar errores tipográficos en imports usados solo por sus efectos secundarios
  • libReplacement por defecto en false: mejora el rendimiento base evitando fallas innecesarias de resolución de módulos y aumentando menos el conjunto de archivos observados

rootDir cambia su valor predeterminado a .

  • Antes, si no se especificaba, se infería a partir del directorio común de todos los archivos de entrada no declarativos
    • Esto implicaba que para determinar si un archivo pertenecía al proyecto había que cargar y parsear ese proyecto
  • En TypeScript 6.0, el valor predeterminado queda fijo en el directorio donde está tsconfig.json
  • Si los archivos fuente están en una ubicación más profunda que tsconfig.json, habrá que configurar explícitamente algo como "rootDir": "./src"
    • Si no se hace, puede generarse una estructura de salida no deseada, como ./dist/src/index.js

types cambia su valor predeterminado a []

  • Antes, se incluían automáticamente todos los paquetes dentro de node_modules/@types, lo que generaba una gran sobrecarga en tiempo de build
    • En repositorios típicos, es común que cientos de paquetes @types queden incluidos transitivamente
  • En TypeScript 6.0, el valor predeterminado cambia a [] (arreglo vacío), evitando cargar archivos de declaraciones innecesarios
  • Se observaron mejoras reales de 20% a 50% en tiempo de build
  • En la mayoría de los proyectos, será necesario configurar explícitamente algo como "types": ["node"] o "types": ["node", "jest"]
    • El comportamiento anterior puede restaurarse con "types": ["*"]

Elementos desaprobados (Deprecation)

Desaprobación de target: es5

  • El target ES5 casi ya no tiene casos de uso tras el retiro de IE y la generalización de navegadores evergreen
  • El target mínimo pasa a ser ES2015, y si se necesita salida ES5 se recomienda usar un compilador externo

Desaprobación de --downlevelIteration

  • Solo tenía efecto en el emit de ES5, así que pierde su razón de ser con la desaprobación del target ES5

Desaprobación de --moduleResolution node (node10)

  • Reflejaba el algoritmo de resolución de módulos de Node.js 10, y ya no coincide con el comportamiento actual de Node.js
  • Se recomienda migrar a nodenext (si apuntas directamente a Node.js) o a bundler (si usas bundlers/Bun)

Desaprobación de valores de módulo AMD, UMD y SystemJS

  • --module amd, --module umd, --module systemjs y --module none dejan de estar soportados
  • Como ESM ya se soporta de forma general tanto en navegador como en Node.js, hay que migrar a un bundler o a un target ESM

Desaprobación de --baseUrl

  • Se usaba principalmente como prefijo de paths, pero también funcionaba como raíz de búsqueda en resolución de módulos, causando problemas de resolución inesperados
  • La migración consiste en quitar baseUrl y agregar el prefijo directamente en las entradas de paths
    • Ejemplo: "@app/*": ["app/*"]"@app/*": ["./src/app/*"]

Desaprobación de --moduleResolution classic

  • Era el algoritmo original de resolución de módulos de TypeScript, pero hoy todos los casos prácticos pueden reemplazarse por nodenext o bundler

Desaprobación de esModuleInterop false y allowSyntheticDefaultImports false

  • Ya no será posible poner ambas opciones en false, por lo que el comportamiento seguro de interop quedará siempre activado
  • Será necesario ajustar casos como import * as express from "express"import express from "express"

Desaprobación de --alwaysStrict false

  • Todo el código pasa a considerarse JavaScript strict mode, por lo que código que use await, static, private, etc. como identificadores normales deberá renombrarlos

Desaprobación de outFile

  • Era una función para combinar múltiples archivos de entrada en uno solo, pero fue reemplazada por bundlers externos como Webpack, Rollup, esbuild y Vite
  • La decisión busca concentrar a TypeScript en su rol principal: type checking y declaración de tipos emitida

Desaprobación de la sintaxis legacy module (declaraciones de namespace)

  • La sintaxis module Foo { ... } queda fuertemente desaprobada, y ahora debe usarse namespace Foo { ... }
  • Las declaraciones de módulos ambient como declare module "some-module" { ... } siguen estando soportadas
  • El objetivo es evitar conflictos con la propuesta de bloques module de ECMAScript

Desaprobación de la palabra clave import asserts

  • Hay que cambiar import ... asserts { type: "json" } por import ... with { type: "json" }
  • Esto responde al cambio de la propuesta de import assertions hacia la propuesta de import attributes (palabra clave with)

Desaprobación de la directiva no-default-lib

  • /// <reference no-default-lib="true"/> deja de estar soportado; se recomienda usar --noLib o --libReplacement

Error al indicar archivos por línea de comandos si existe tsconfig.json

  • Si se ejecuta tsc foo.ts y en el mismo directorio existe tsconfig.json, se producirá un error
  • Puede ignorarse explícitamente con el flag --ignoreConfig

Preparando TypeScript 7.0

  • Las opciones desaprobadas en 6.0 pueden seguir usándose sin error con "ignoreDeprecations": "6.0", pero en 7.0 se eliminarán por completo
  • La herramienta ts5to6 permite ajustar automáticamente cosas como baseUrl y rootDir
  • El lanzamiento de TypeScript 7.0 está previsto dentro de unos meses, y ya se está adoptando ampliamente en grandes bases de código dentro y fuera de Microsoft
  • Se recomienda enviar feedback mediante los builds nightly del preview nativo y la extensión de VS Code

3 comentarios

 
tsboard 2026-03-26

¡Tengo muchas ganas de que llegue el momento en que se haga la transición completa a un compilador basado en Go!

 
princox 2026-03-25

¿Eh? ¿TypeScript después va a cambiar a una versión nativa basada en Go?

 
helio 2026-03-25

Solo el compilador