Сервис развивается: тестируем формат, собираем идеи, улучшаем сервис. Есть идеи?

Написать
Войти
Дайджесты
Иллюстрация ускоренного компилятора TypeScript 7.0 на Go

TypeScript 7.0: почему компилятор переписали на Go и что это дает

Обзор новой мажорной версии TypeScript 7.0, в которой компилятор был полностью переписан с TypeScript на Go. Разбор ключевых нововведений: многопоточного тайп-чекинга, параллельной сборки проектов и прироста производительности в 8–12 раз, а также процесса совместимости и миграции с версии 6.0.

TypeScript 7.0: почему компилятор переписали на Go и что это дает

8 июля 2026 года команда разработки Microsoft анонсировала выпуск новой мажорной версии TypeScript 7.0. Это событие знаменует собой начало новой эпохи в инфраструктуре веб-разработки: компилятор популярного языка статического анализа был полностью переписан с TypeScript/JavaScript на системный язык Go. Релиз ориентирован прежде всего на радикальное ускорение процессов сборки и уменьшение времени ожидания обратной связи при написании кода. Разработчики получили прирост производительности компиляции (full builds) в 8–12 раз, а также снижение потребления оперативной памяти на 6–26%. TypeScript 7.0 представляет многопоточный тайп-чекинг, переработанный режим отслеживания файлов и строгий переход к новым стандартам конфигурации.

Почему Go: преодоление барьеров JavaScript Runtime

Исторически компилятор TypeScript (tsc) был написан на самом TypeScript и выполнялся поверх виртуальной машины JavaScript (V8 в Node.js). Для больших кодовых баз и монорепозиториев это накладывало жесткие ограничения:

  • Однопоточность. JavaScript по умолчанию выполняет код в один поток. Хотя Node.js поддерживает Worker Threads, их использование для компилятора сопряжено с большим расходами на копирование данных между изолированными кучами (heaps).
  • Управление памятью (Garbage Collection). Процесс статического анализа типов создает миллионы мелких объектов в памяти. Постоянная работа сборщика мусора в JS-среде приводила к частым задержкам и блокировкам Event Loop в тяжелых вычислительных задачах.
  • Нативная скорость. Компиляция на языке Go выполняется напрямую в машинный код. Go предоставляет дешевую многопоточность с разделяемой памятью (goroutines) и оптимизированную работу с кучей, что делает его идеальным выбором для задач обхода сложных графов типов.

Microsoft подчеркивает, что портирование компилятора велось максимально строго: разработчики сохранили оригинальную структуру и логику старой кодовой базы, чтобы гарантировать полную идентичность результатов компиляции между старыми JS-версиями и новым нативным компилятором на Go.

Показатели производительности на реальных проектах

В официальном анонсе Announcing TypeScript 7.0 приведены результаты сравнительного тестирования компиляции крупных открытых проектов на версиях TypeScript 6 и 7.

Скорость полной сборки проектов (Full Build Speed):

  • VS Code: время сборки сократилось со 125.7 с до 10.6 с (ускорение в 11.9 раза).
  • Sentry: со 139.8 с до 15.7 с (ускорение в 8.9 раза).
  • Bluesky: с 24.3 с до 2.8 с (ускорение в 8.7 раза).
  • Playwright: с 12.8 с до 1.47 с (ускорение в 8.7 раза).
  • Tldraw: с 11.2 с до 1.46 с (ускорение в 7.7 раза).

Потребление оперативной памяти (Memory Usage):

  • VS Code: снизилось с 5.2 GB до 4.2 GB (на 18%).
  • Sentry: с 4.9 GB до 4.6 GB (на 6%).
  • Bluesky: с 1.8 GB до 1.3 GB (на 26%).
  • Playwright: с 1.0 GB до 0.9 GB (на 11%).
  • Tldraw: с 0.6 GB до 0.5 GB (на 15%).

Помимо сборки, существенно ускорилась работа редактора в реальном времени. В кодовой базе VS Code вывод первой ошибки диагностики при открытии файла сократился с 17.5 секунд до 1.3 секунд (улучшение в 13 раз). В компании Slack интеграция TypeScript 7.0 позволила сократить время проверки типов в CI с 7.5 минут до 1.25 минут, исключив до 40% задержек в очереди слияния (merge queue). В Microsoft News Services внедрение новой версии сэкономило разработчикам в общей сложности до 400 часов ожидания сборок CI в месяц. Наконец, в Canva время до вывода первой ошибки в редакторе снизилось с 58 до 4.8 секунд.

Механизмы многопоточности и управления ресурсами

В новой архитектуре компилятора реализована полноценная параллелизация фаз парсинга кода, проверки типов и записи готовых файлов. Для управления производительностью добавлены новые флаги командной строки:

  • --checkers <число> — задает количество параллельных воркеров для проверки типов (по умолчанию используется 4 воркера). При увеличении этого значения на многоядерных процессорах можно добиться еще большей скорости сборки, но вырастет и потребление памяти. Например, при установке --checkers 8 время сборки VS Code падает до 7.51 с (ускорение в 16.7 раза по сравнению с TS 6), а Sentry — до 12.08 с (ускорение в 11.6 раза).
  • --builders <число> — управляет количеством параллельных сборщиков ссылок проектов при сборке монорепозиториев через ключ --build. Стоит учитывать мультипликативный эффект: одновременный запуск --builders 4 и --checkers 4 может породить до 16 параллельных процессов проверки типов, что может перегрузить систему.
  • --singleThreaded — полностью отключает параллелизацию. Этот режим полезен для отладки, сравнения работы компилятора, работы в облачных средах с ограниченными ресурсами процессора или при внешней оркестрации сборки.

Разработчики также переписали режим отслеживания изменений --watch. Раньше Go-компилятор тратил много ресурсов на периодический опрос (polling) файлов зависимостей в больших проектах. Команда Microsoft интегрировала в Go-код архитектурные принципы быстрого файлового наблюдателя из сборщика Parcel, что позволило отказаться от тяжелого C++ инструментария и повысить кроссплатформенную стабильность работы с файловой системой.

Совместимость с TypeScript 6.0 и особенности миграции

Новая версия TypeScript 7.0 стремится сохранить полную совместимость со стандартами разметки типов и флагами командной строки TypeScript 6.0. Чтобы облегчить переход, разработчикам рекомендуется сначала обновить свои проекты до версии 6.0 и исправить все предупреждения. В версии 7.0 все устаревшие конфигурационные параметры вызывают фатальные ошибки компиляции (hard errors).

В TypeScript 7.0 прекращена поддержка следующих флагов и режимов:

  • Выходной формат target: es5 и опция downlevelIteration.
  • Устаревшие типы разрешения модулей node/node10 и classic.
  • Поддержка старых форматов модулей amd, umd, systemjs и none.
  • Параметры конфигурации baseUrl, отключение esModuleInterop и allowSyntheticDefaultImports.
  • Использование ключевого слова assert в импортах (теперь обязательно with).

Важнейшее ограничение версии 7.0 — отсутствие стабильного программного API (Programmatic API). Создание стабильного программного интерфейса для интеграции компилятора Go в сторонние инструменты планируется в версии TypeScript 7.1.

Это означает, что сложные экосистемные инструменты, требующие глубокой интеграции с компилятором — такие как линтеры (typescript-eslint), шаблонизаторы Vue (vue-tsc), Astro, Svelte, MDX или компилятор шаблонов Angular — не смогут сразу использовать нативный компилятор TypeScript 7.0 и временно останутся на кодовой базе версии 6.0.

Для решения этой проблемы Microsoft позволяет запускать TypeScript 7 параллельно с TypeScript 6. Для этого выпущен специальный пакет обратной совместимости @typescript/typescript6, который предоставляет исполняемый файл tsc6 и программное API версии 6.0. Установка выполняется через npm-псевдонимы:

npm install -D typescript@npm:@typescript/typescript6

Проект может использовать CLI-компилятор tsc версии 7.0 для быстрых общих проверок и одновременно обращаться к tsc6 для специфических сборок шаблонов.

Новое поведение типов и различия при обработке JavaScript

TypeScript 7.0 принес несколько изменений в логике вывода типов и анализа JavaScript:

  1. Строгое соответствие Unicode в шаблонных литералах. Ранее при выделении частей из строк вида "😀abc" компилятор ориентировался на суррогатные пары UTF-16, что приводило к разделению смайлика на некорректные половины. В версии 7.0 типы шаблонных литералов работают на уровне кодовых точек Unicode, корректно выделяя символ "😀".
  2. Унификация JSDoc-анализа для JavaScript. Логика работы с JS-файлами была приближена к правилам строгого TypeScript. В частности, значения больше нельзя использовать на месте типов без ключевого слова typeof, поддержка устаревших аннотаций @enum, @class (для создания конструкторов функций) и постфиксного восклицательного знака ! была прекращена, а одиночный тип ? заменен на стандартный any.

Релиз TypeScript 7.0 — это важнейший шаг по переходу веб-инструментов на нативные технологии сборки. Проекты, ориентированные на командную строку и стандартный запуск сборщика, могут выполнять миграцию уже сегодня для получения мгновенного прироста скорости в CI и редакторе. Инструментам, зависящим от программного API, стоит дождаться выпуска TypeScript 7.1 с готовой поддержкой внешних интеграций.