TypeScript ya no es TypeScript...

BBetter Stack
컴퓨터/소프트웨어AI/미래기술

Transcript

00:00:00TypeScript acaba de lanzar una versión candidata para la versión 7 y esta será la versión donde
00:00:04TypeScript no es TypeScript. Si has estado desconectado, han estado trabajando en reescribir el
00:00:07compilador de TypeScript, pasando de TypeScript mismo a Go, y al parecer los resultados son 10 veces más rápidos.
00:00:12Esperan lanzar TypeScript 7 el próximo mes, así que vamos a ver qué ha cambiado realmente,
00:00:17qué tan rápido es y si hay algún cambio importante que necesites saber antes de instalarlo.
00:00:26Así que, si te perdiste la noticia sobre la migración a Go, empezaron hace aproximadamente un año
00:00:29y el resumen es que se dieron cuenta de que JavaScript nunca fue diseñado para el trabajo pesado intensivo en CPU
00:00:34que requiere un verificador de tipos, así que comenzaron a reescribirlo en Go con gran éxito inicial. De hecho, empezaron
00:00:39básicamente portando la implementación existente de TypeScript casi línea por línea, por lo que la lógica de
00:00:44verificación de tipos era estructuralmente igual y tenía el mismo comportamiento, e incluso podías ver que algunas
00:00:48de las funciones eran casi idénticas, salvo por el lenguaje. También estoy bastante seguro de que esto fue antes de
00:00:52que pudieras simplemente apuntar a Claude a tu base de código y decir “migra al lenguaje que quieras”.
00:00:56Te estoy mirando, Bun. Los resultados de la migración hablan por sí solos. Aquí tengo
00:01:00el repositorio de Playwright y si hago una comprobación de tipos usando la versión antigua de TypeScript aquí, podemos ver que esto
00:01:04tarda alrededor de seis segundos en completarse y procesó 1400 archivos y medio millón de líneas de
00:01:08código. Si ahora cambio a la versión candidata sin cambiar nada más que este comando,
00:01:12en total tomó 0,87 segundos. Eso es una mejora seria. También encontró exactamente la misma cantidad de
00:01:18errores, los mismos errores; revisó los mismos archivos y todas las líneas de código, así que funciona exactamente
00:01:23igual que TypeScript 6. El código nativo de Go es simplemente fundamentalmente más rápido que JavaScript para una
00:01:27tarea como esta, pero también les permite usar el paralelismo de memoria compartida. Así que, donde el compilador de JavaScript
00:01:32era monohilo, Go puede distribuir esa verificación de tipos en múltiples núcleos a la vez. En TypeScript
00:01:377 puedes incluso forzar que sea monohilo con una bandera, tal vez por si estás haciendo depuración
00:01:41o estás ejecutando en una máquina con recursos limitados. Y si hago esto en la base de código de Playwright
00:01:46aquí con TypeScript 7, podemos ver que al ser monohilo toma alrededor de dos segundos, lo cual es
00:01:50todavía tres veces más rápido que antes. Hablando de ejecutar en paralelo, también están exponiendo
00:01:54una nueva bandera de verificadores (checkers) que en realidad te permite establecer cuántos trabajadores de verificación de tipos pueden ejecutarse en paralelo
00:01:58y esto tiene un valor predeterminado de cuatro. Aumentar esto podría acelerar tus compilaciones en bases de código más grandes si
00:02:03tienes muchos núcleos de CPU, pero vendrá a costa de un mayor uso de memoria. Si configuro los verificadores
00:02:08a 8 en este repositorio de Playwright, que es el doble del valor predeterminado, realmente parece reducir otro
00:02:12tercio del tiempo. También hay una nueva bandera de constructores (builders) para paralelizar las compilaciones de referencia de proyectos, es decir, compilar
00:02:16múltiples proyectos a la vez, y esta bandera te permite controlar el número de constructores paralelos que pueden
00:02:20ejecutarse a la vez. Y vale la pena señalar que si combinas esto con los verificadores que acabamos de ver, digamos
00:02:24que tienes cuatro de cada uno, eso significa que puedes tener hasta 16 verificadores de tipo ejecutándose a la vez. Ahora, además de
00:02:29los cambios en el código nativo y el paralelismo, otra gran reescritura en TypeScript 7 ha sido su modo de vigilancia (watch mode).
00:02:34Cuando pasaron a Go, esto fue en realidad un poco más complicado, ya que la biblioteca estándar no proporciona
00:02:38APIs de vigilancia de archivos integradas, y las bibliotecas de terceros que probaron tenían problemas con cosas como
00:02:43estabilidad, rendimiento y soporte multiplataforma. Así que el equipo miró el vigilante de archivos del
00:02:47empaquetador Parcel, que Microsoft de hecho usa un poco en VS Code, pero como estaba en C++, también
00:02:53tuvieron que portar las partes que necesitaban a Go también. La buena noticia, sin embargo, es que hicieron
00:02:57todo y parece estar funcionando realmente bien y mejor que antes. A continuación, como esto es
00:03:01un cambio de versión mayor, podrías estar esperando muchos cambios importantes, especialmente porque es una gran
00:03:05reescritura, pero en realidad no creo que haya ninguno si estás actualizando de TypeScript 6 a 7. Si
00:03:10quieres pasar de 5 a 7 sí habrá bastantes, así que parece que recomiendan que
00:03:14subas a 6 primero, hagas que todo funcione, y luego el salto de versión a 7 no debería tener problemas. Algunos de
00:03:19los grandes cambios en TypeScript 6 fueron eliminar el objetivo ES5, eliminar baseUrl y depreciar los sistemas de
00:03:24módulos AMD, UMD y SystemJS. También hicieron que strict fuera true por defecto, hicieron que module fuera esnext por defecto
00:03:31y el objetivo (target) por defecto es la versión actual estable de ECMAScript inmediatamente anterior a esnext. Fue
00:03:36básicamente mucho dejar atrás el pasado y modernizar TypeScript, lo cual realmente me gusta ya que
00:03:40a veces intentar soportar proyectos heredados en cada versión que haces puede ralentizar realmente el
00:03:45progreso de una herramienta. Mirando el resto de esta publicación de blog, en realidad parece que la única característica
00:03:49o cambio nuevo que concierne al lenguaje TypeScript en sí es que los tipos de literales de plantilla
00:03:53ahora preservan los puntos de código Unicode. Esencialmente, antes de TypeScript 7, TypeScript en realidad dividía en unidades de código UTF-16,
00:03:59por lo que terminaba dividiendo un emoji por la mitad y terminabas con estos tipos extraños para la cabeza
00:04:04y la cola aquí. Sin embargo, en TypeScript 7, en realidad divide en puntos de código completos, es decir, caracteres completos,
00:04:09así que ahora el emoji se preserva y la división es prácticamente como esperarías que fuera. Estaría
00:04:13honestamente increíblemente impresionado si alguno de ustedes se ha encontrado alguna vez con esto en su tiempo usando TypeScript.
00:04:18Con todo, estos cambios deberían hacer que todo lo que usa TypeScript se sienta mucho más rápido, como TypeScript
00:04:22en tu editor, especialmente para grandes proyectos. Se espera el lanzamiento estable en aproximadamente un mes,
00:04:27pero una API programática estable, es decir, lo que los autores de herramientas usan para construir sobre el compilador,
00:04:32llegará en la versión 7.1. Debido a esto, también hay un paquete de compatibilidad para que puedas ejecutar
00:04:36TypeScript 6 y 7 lado a lado sin entrar en conflictos. Déjame saber qué piensas de todo
00:04:41esto y tengo curiosidad de si alguna vez sentiste que TypeScript se sentía lento. Déjamelo saber en
00:04:44los comentarios. Mientras estás ahí abajo, suscríbete y como siempre, nos vemos en la próxima.

Key Takeaway

La migración de TypeScript 7 a Go y la implementación de paralelismo multi-núcleo reducen drásticamente los tiempos de compilación, permitiendo procesar proyectos complejos a una velocidad significativamente mayor.

Highlights

  • TypeScript 7 reescribe el compilador de JavaScript a Go, logrando una velocidad hasta 10 veces superior en comprobaciones de tipos.

  • La migración a Go permite el uso de paralelismo de memoria compartida, superando la limitación monohilo de la versión basada en JavaScript.

  • En una base de código de medio millón de líneas (Playwright), TypeScript 7 completa la comprobación de tipos en 0,87 segundos frente a los 6 segundos de la versión anterior.

  • Las nuevas banderas de configuración permiten definir el número de trabajadores para la verificación de tipos (checkers) y la compilación de proyectos (builders) en paralelo.

  • Los tipos de literales de plantilla ahora preservan los puntos de código Unicode completos en lugar de dividir caracteres UTF-16, como emojis, a la mitad.

Timeline

Migración a Go y mejoras de rendimiento

  • El compilador de TypeScript fue reescrito en Go para manejar tareas intensivas de CPU.
  • El rendimiento en la comprobación de tipos mejora de 6 segundos a 0,87 segundos en bases de código grandes.

La reescritura desde JavaScript, lenguaje no diseñado para cargas de trabajo de compilación pesadas, permite una ejecución más eficiente. La nueva implementación mantiene la lógica y el comportamiento de verificación de tipos de TypeScript 6, pero se ejecuta sobre una base nativa mucho más rápida.

Paralelismo y nuevas configuraciones

  • Go facilita la distribución de la carga de trabajo en múltiples núcleos de CPU mediante memoria compartida.
  • Nuevas banderas de control permiten ajustar el paralelismo de verificadores y constructores de proyectos.

A diferencia del compilador original monohilo, TypeScript 7 permite ejecutar múltiples verificadores en paralelo. Por defecto, se asignan cuatro trabajadores, pero esta cifra es configurable, permitiendo escalar el rendimiento según la capacidad de hardware del usuario.

Actualización, compatibilidad y cambios en el lenguaje

  • El modo de vigilancia (watch mode) ha sido portado exitosamente a Go con mejor estabilidad y rendimiento.
  • La actualización de TypeScript 6 a 7 no presenta cambios importantes, mientras que pasar de la versión 5 requiere una transición intermedia.
  • Los tipos de literales de plantilla ahora procesan correctamente caracteres Unicode, evitando la fragmentación de emojis.

La reescritura del sistema de vigilancia de archivos utiliza componentes de Parcel adaptados a Go. Para garantizar la estabilidad en la transición, existe un paquete de compatibilidad que permite ejecutar las versiones 6 y 7 simultáneamente, mientras que la API programática estable se reserva para la versión 7.1.

Community Posts

No posts yet. Be the first to write about this video!

Write about this video