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

Написать
Войти
Дайджесты
Стилизованный быстрый компилятор TypeScript на Go

Исторический релиз TypeScript 7.0: полный перенос компилятора tsc на язык Go

Историческое обновление TypeScript 7.0 полностью меняет правила игры для больших кодовых баз: компилятор tsc переписан на Go, что дало десятикратное ускорение сборки и снизило потребление ОЗУ. Разбираем реальные тесты производительности, новые строгие правила и временные ограничения для Vue и Svelte.

Исторический релиз TypeScript 7.0: полный перенос компилятора tsc на Go

Исторический релиз TypeScript 7.0, состоявшийся 8 июля 2026 года, знаменует собой крупнейшую архитектурную перестройку за все время существования технологии. Команда разработчиков Microsoft полностью переписала компилятор tsc и сопутствующий языковой сервер с JavaScript на язык Go. Это стратегическое решение направлено на преодоление фундаментальных физических ограничений платформы Node.js и движка V8 при обработке крупных кодовых баз, насчитывающих миллионы строк кода.

Долгое время разработчики крупных веб-приложений были вынуждены мириться с медленной работой компилятора. Потоковые вычисления, динамический анализ типов и поддержание кэша в рамках однопоточной по своей сути виртуальной машины JavaScript приводили к тому, что проверка типов на CI/CD-серверах занимала драгоценные минуты, а разработчики в редакторах кода ждали подсказок по несколько секунд. Перенос кодовой базы компилятора на скомпилированный язык Go с его нативной поддержкой многопоточности и эффективным управлением разделяемой памятью позволил решить эти проблемы на системном уровне.

Результаты тестов: десятикратное ускорение сборок

Практические замеры производительности на реальных проектах, опубликованные в официальном анонсе Microsoft, демонстрируют впечатляющий скачок скорости. На крупных и известных кодовых базах время полной компиляции снизилось в разы:

  • Сборка редактора VS Code ускорилась более чем в 11 раз — с 125,7 до 10,6 секунды;
  • Компиляция системы мониторинга Sentry ускорилась почти в 9 раз — с 139,8 до 15,7 секунды;
  • Время проверки типов клиента социальной сети Bluesky сократилось с 24,3 до 2,8 секунды;
  • Сборка фреймворка Playwright ускорилась с 12,8 до 1,47 секунды;
  • Компиляция библиотеки tldraw сократилась с 11,2 до 1,46 секунды.

Не менее важные показатели зафиксированы в области потребления оперативной памяти (ОЗУ). За счет избавления от накладных расходов виртуальной машины V8 и оптимизированного распределения памяти в Go компилятор стал расходовать меньше ресурсов. Потребление памяти при компиляции VS Code снизилось с 5,2 ГБ до 4,2 ГБ, на кодовой базе Sentry — с 4,9 ГБ до 4,6 ГБ, на проекте Bluesky — с 1,8 ГБ до 1,3 ГБ.

Кроме того, разработчики сообщают о резком росте отзывчивости сред разработки. Время ожидания первого сообщения об ошибке при запуске VS Code на большой кодовой базе сократилось с 17,5 секунды до рекордных 1,3 секунды. Инженеры компании Slack поделились первыми результатами внедрения новой версии: время сборки в очередях интеграции (merge queue) сократилось на 40%, а средняя длительность CI-проверки снизилась с 7,5 минуты до 1,25 минуты. В масштабах сервиса Microsoft News Services экономия чистого времени ожидания сборщиками изменений на CI-серверах составила около 400 часов в месяц.

Новые инструменты управления параллелизмом

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

  • --checkers — задает количество параллельных потоков, выделяемых операционной системой для независимой проверки типов;
  • --builders — определяет число потоков, занятых сборкой файлов и генерацией итогового кода;
  • --singleThreaded — полностью отключает параллельные вычисления и переводит компилятор в однопоточный режим, что необходимо для отладки или работы на серверах с жесткими ограничениями по ресурсам.

Существенные изменения претерпел и фоновый режим непрерывного отслеживания файлов (watch mode). Механизм опроса изменений был полностью переписан и переведен на алгоритмы, вдохновленные библиотекой Parcel watcher. Это позволило отказаться от ресурсоемкого периодического опроса файловой системы (polling), который вызывал высокую нагрузку на процессоры при работе с крупными проектами и папками зависимостей node_modules.

Строгие правила компиляции и удаление устаревших настроек

TypeScript 7.0 фиксирует в качестве настроек по умолчанию конфигурации, принятые в предыдущей ветке 6.0. Это означает, что строгая проверка типов (strict) включена по умолчанию, параметр генерации модулей установлен в esnext, а также активирована строгая упорядоченность типов при генерации объявлений (stableTypeOrdering выставлен в значение true). По умолчанию папка назначения типов (types) является пустой ([]), корневой каталог исходного кода (rootDir) ссылается на текущую папку (./), а импорт файлов, не имеющих явного экспорта, теперь строго контролируется параметром noUncheckedSideEffectImports в значении true.

Для упрощения компилятора и повышения его надежности из конфигурационного файла tsconfig.json был полностью удален ряд устаревших опций. Использование следующих параметров теперь приводит к ошибкам компиляции (hard errors) или игнорируется:

  • Таргет компиляции target в значение es5 и сопутствующий полифил итераторов downlevelIteration больше не поддерживаются;
  • Устаревшие стратегии разрешения путей к файлам moduleResolution со значениями node, node10 и classic удалены;
  • Форматы модулей amd, umd, systemjs и none исключены из компилятора;
  • Отключение совместимости с CommonJS-модулями (esModuleInterop: false) и настройка базового пути baseUrl переведены в разряд недопустимых.

Также изменения затронули анализ JavaScript-файлов. Поддержка устаревших типов JSDoc и Closure-стиля аннотирования типов была существенно сокращена в пользу стандартных объявлений TypeScript. При этом механизм вывода типов для строковых шаблонов (Unicode template literal inference) теперь полностью учитывает кодовые точки символов (code points), что предотвращает некорректное разбиение суррогатных пар эмодзи при строковых преобразованиях.

Совместимость с экосистемой и ограничения миграции

Главным компромиссом релиза TypeScript 7.0 стало временное отсутствие стабильного программного интерфейса (API) для интеграции компилятора во внешние инструменты сборки. Ожидается, что полноценное программное API будет представлено только в следующем релизе TypeScript 7.1.

По этой причине инструменты сборки и плагины для работы с экосистемами фреймворков со встроенными шаблонами разметки (такие как Vue, Astro, Svelte, MDX, а также специализированные шаблоны Angular) пока не могут полноценно использовать компилятор версии 7.0 для анализа файлов внутри своих сборщиков. Для решения этой проблемы команда Microsoft опубликовала переходный пакет @typescript/typescript6. Этот пакет позволяет разработчикам использовать программное API TypeScript 6 для работы сторонних плагинов и одновременно задействовать новый компилятор TypeScript 7 CLI в командной строке для финальной сборки.

Пошаговое руководство по обновлению проектов

Для перехода на новую версию компилятора рекомендуется выполнить следующие шаги:

  1. Создание тестовой ветки. Выделите отдельную ветку в системе контроля версий для безопасного тестирования миграции.
  2. Обновление зависимостей. Установите новую версию компилятора в качестве зависимости разработки с помощью стандартной команды в терминале: npm install -D typescript
  3. Проверка версии. Убедитесь, что система использует обновленный исполняемый файл, запустив: npx tsc --version
  4. Конфигурация tsconfig. Откройте файл tsconfig.json, удалите устаревшие свойства (такие как baseUrl или downlevelIteration) и настройте требуемое количество потоков с помощью флагов.
  5. Тестирование сборки. Запустите компиляцию проекта: npx tsc --noEmit
  6. Оценка времени компиляции. Измерьте скорость выполнения проверки типов на сервере сборки CI/CD до и после обновления.
  7. Интеграция сторонних инструментов. При использовании Vue, Svelte или Astro установите переходный пакет для совместимости: npm install -D @typescript/typescript6 Это позволит сохранить работоспособность плагинов сборщика до обновления инструментов.

В случае возникновения несовместимости с плагинами вы всегда можете откатить изменения, вернув предыдущую мажорную версию в файле package.json и перезапустив установку зависимостей. Подробный разбор нововведений и изменений доступен в официальном блоге разработчиков Microsoft.