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

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

TypeScript 7.0 RC: Полный перенос компилятора на Go

TypeScript анонсировал Release Candidate версии 7.0, компилятор которой был полностью переписан на языке Go. Новая архитектура с нативной скоростью и параллелизмом ускорила сборку крупных проектов в 10 раз при полной совместимости с семантикой TypeScript 6.0 и поддержке параллельного type-checking.

TypeScript 7.0 RC: Полный перенос компилятора на Go

18 июня 2026 года команда разработки TypeScript представила Release Candidate версии 7.0. Главной особенностью этого релиза стал полный перенос компилятора (tsc) с TypeScript на язык Go. Это фундаментальное изменение архитектуры, над которым инженеры работали больше года, призвано радикально решить проблему скорости сборки крупных JavaScript- и TypeScript-проектов.

Архитектурное портирование вместо переписывания

В отличие от многих проектов, которые переписывают кодовые базы с нуля, команда TypeScript пошла по пути структурного портирования (structural porting). Это означает, что существующий код компилятора на TypeScript, который ранее компилировался в JavaScript и запускался на Node.js, был шаг за шагом переведен на язык Go с сохранением структуры классов, функций и алгоритмов.

Такой подход позволил сохранить полную семантическую идентичность. Логика проверки типов (type-checking) в версии 7.0 RC работает точно так же, как и в стабильной версии TypeScript 6.0. Команда тестировала новый компилятор на огромной тестовой базе, накопленной за десять лет развития языка, а также на кодовых базах Microsoft, содержащих миллионы строк кода. Архитектурная идентичность гарантирует, что TypeScript 7.0 будет компилировать существующий код без появления ложноположительных или ложноотрицательных ошибок типизации.

Благодаря нативной скорости скомпилированного кода Go и возможностям параллельной работы с общей памятью (shared-memory parallelism), компилятор TypeScript 7.0 демонстрирует десятикратное (до 10x) ускорение сборки и type-checking по сравнению с TypeScript 6.0 на крупных проектах. pre-release сборки были успешно протестированы инженерами таких компаний, как Bloomberg, Canva, Figma, Google, Lattice, Linear, Miro, Notion, Slack, Vanta, Vercel и VoidZero, которые сообщили о значительном сокращении времени прохождения CI/CD пайплайнов и повышении отзывчивости интерфейса в редакторах.

Параллелизм и тонкая настройка компиляции

Компилятор TypeScript 7.0 выполняет парсинг, проверку типов и генерацию файлов в параллельных потоках. Однако не все этапы можно легко распараллелить. Например, проверка типов сильно зависит от глобального контекста и зависимостей между файлами, а также от порядка их обработки для обеспечения детерминированного результата.

Для настройки параллельной работы компилятора добавлены новые флаги:

  • --checkers: управляет количеством независимых воркеров для проверки типов (type-checking). По умолчанию запускается 4 воркера. Увеличение этого числа на мощных многоядерных процессорах позволяет дополнительно ускорить сборку, но увеличивает потребление оперативной памяти. На CI-раннерах с ограниченными ресурсами рекомендуется фиксировать это значение (например, выставлять --checkers 2 или --checkers 1), чтобы избежать падения сборки по ошибке Out Of Memory (OOM). В редких сценариях изменение числа checkers может повлиять на порядок вывода ошибок, поэтому фиксация значения обеспечивает воспроизводимость сборок в команде.
  • --builders: отвечает за распараллеливание сборки связанных проектов в монорепозиториях (Project References). Этот флаг имеет мультипликативный эффект в сочетании с --checkers. Например, запуск tsc --builders 4 --checkers 4 создаст до 16 параллельных процессов проверки типов, что может привести к чрезмерной нагрузке на CPU и память.
  • --singleThreaded: принудительно запускает компилятор в один поток (один воркер проверки типов, последовательный парсинг и генерация). Режим полезен для отладки, сравнения производительности между версиями и интеграции компилятора во внешние системы оркестрации сборок.

Новый режим наблюдения (--watch)

Режим отслеживания изменений файлов (--watch) был полностью переписан на базе файлового вотчера из сборщика Parcel. В процессе портирования команда TypeScript столкнулась со сложностями кроссплатформенного отслеживания файлов в Go, так как стандартная библиотека не предоставляет универсального эффективного API. Использование чистого периодического опроса (polling) потребляло слишком много ресурсов CPU, особенно на крупных проектах с огромными папками node_modules.

Решением стал перенос логики библиотеки @parcel/watcher (написанной на C++) на чистый Go с использованием минимальных ассемблерных вставок (shims). Это позволило сохранить высокую скорость работы и кроссплатформенность без добавления сложных зависимостей от компиляторов C++. Новый вотчер значительно сократил потребление системных ресурсов в режиме разработки.

Дефолты конфигурации и устаревшие опции

TypeScript 7.0 RC наследует новыеDefaults конфигурации, представленные в TypeScript 6.0, и превращает старые предупреждения в жесткие ошибки компиляции (hard errors):

  • Опция strict теперь установлена в true по умолчанию.
  • Опция module по умолчанию имеет значение esnext.
  • Опция target по умолчанию соответствует последней стабильной версии ECMAScript.
  • Опции noUncheckedSideEffectImports и stableTypeOrdering (которую теперь нельзя отключить) по умолчанию установлены в true.
  • Опция rootDir по умолчанию указывает на ./ (если tsconfig.json лежит вне директории с исходным кодом, например src, необходимо явно прописывать "rootDir": "./src").
  • Опция types теперь по умолчанию пустая ([]). Для автоматического подключения глобальных объявлений необходимо явно перечислять типы (например, ["node", "jest"]) или вернуть старое поведение с помощью ["*"]).
  • Устаревшие настройки больше не поддерживаются и вызывают ошибки: target: es5, downlevelIteration, moduleResolution: node/node10/classic (вместо них рекомендуются nodenext или bundler), module: amd/umd/systemjs/none, а также baseUrl (вместо него следует использовать относительные пути от корня проекта).
  • Атрибуты импорта теперь требуют использования ключевого слова with вместо устаревшего asserts (например, import data from "./data.json" with { type: "json" }).

Инструкция по переходу и тестированию

Для внедрения TypeScript 7.0 RC в ваш проект выполните следующие шаги:

  1. Установите Release Candidate версию в качестве dev-зависимости:
    npm install -D typescript@rc
    
  2. Проверьте успешность установки, выведя версию компилятора:
    npx tsc --version
    # Ожидаемый вывод: Version 7.0.1-rc (или аналогичная сборка)
    
  3. Для интеграции с редактором VS Code установите официальное расширение TypeScript Native Preview. Оно обеспечивает работу автодополнения и валидации типов через Language Server Protocol (LSP) на том же быстром Go-движке.
  4. Для плавного перехода и решения конфликтов с инструментами, которые используют старый программный API (стабильный API TypeScript 7 ожидается только в версии 7.1), используйте совместимый пакет @typescript/typescript6, предоставляющий бинарник tsc6 и API 6.0. Вы можете настроить пакетный менеджер с помощью npm-алиасов:
    {
      "devDependencies": {
        "typescript": "npm:@typescript/typescript6@^6.0.0",
        "typescript-7": "npm:typescript@rc"
      }
    }
    
    Это позволит использовать npx tsc для запуска версии 7.0, в то время как typescript-eslint продолжит импортировать API версии 6.0 по алиасу.
  5. Если вы хотите тестировать новейшие сборки компилятора, установите ночной пакет:
    npm install -D @typescript/native-preview
    
    Этот пакет предоставляет бинарный файл под именем tsgo.