TypeScript 7.0 Beta: компилятор на Go в 10 раз быстрее tsc

tsgo ставится рядом с tsc без конфликтов. Разбираем: что ускоряется, какие флаги ломаются и как подготовить монорепо к миграции.

Обложка: TypeScript 7.0 Beta: компилятор на Go в 10 раз быстрее tsc

21 апреля 2026 Microsoft выпустила TypeScript 7.0 Beta — компилятор, целиком переписанный с TypeScript на Go и работающий примерно в 10 раз быстрее старого tsc. Новый бинарник tsgo ставится рядом со старым компилятором, без конфликтов — пробовать в CI и редакторе можно прямо сейчас.

Перенос занял у команды TypeScript весь прошлый год. Логика проверки типов структурно идентична TypeScript 6.0, компилятор прогоняется через тестовый корпус, накопленный за десять лет, и уже работает на нескольких кодовых базах в миллионы строк — внутри Microsoft и снаружи.

Кратко
  • Дата релиза: 21 апреля 2026 (Beta), стабильный релиз — в течение двух месяцев
  • Скорость: ~10× быстрее TypeScript 6.0 за счёт нативного кода и параллелизма
  • Установка: пакет @typescript/native-preview@beta
  • Запуск: tsgo вместо tsc, поведение совместимо
  • Новые флаги: --checkers, --builders, --singleThreaded
  • Боевая обкатка: Bloomberg, Canva, Figma, Google, Lattice, Linear, Miro, Notion, Slack, Vanta, Vercel, VoidZero
  • Сломанные флаги: target: es5, downlevelIteration, moduleResolution: node/node10, baseUrl и ещё несколько

Откуда взялись 10×

Прирост скорости складывается из двух эффектов. Первый — нативный код вместо JavaScript: парсер, чекер и эмиттер скомпилированы в машинный код Go. Второй — параллелизм: TypeScript 7.0 раскладывает парсинг, проверку типов и эмит на несколько потоков. Чем больше кодовая база — тем заметнее выигрыш.

У параллелизма есть нюанс. Парсинг и эмит файлов почти независимы и масштабируются хорошо. А вот проверка типов завязана на порядок: если запустить чекеры независимо, результаты разъедутся между запусками. Решение команды — фиксированное число воркеров-чекеров (по умолчанию 4), у которых одинаковое разделение файлов и одинаковое представление о мире.

  • --checkers — число type-check воркеров (по умолчанию 4).
  • --builders — параллельная сборка проектов в монорепе.
  • --singleThreaded — отключает параллелизм для отладки и сравнения с TS6.

Воркеры перемножаются: --checkers 4 --builders 4 — это до 16 одновременно работающих чекеров. Команда советует подбирать значения под железо: больше CPU — больше воркеров, ограниченные CI-раннеры — меньше. Учтите, что число --checkers может в редких случаях влиять на воспроизводимость результатов между прогонами; число --builders — нет.

Что ломается при переходе на TypeScript 7.0

TypeScript 7.0 принимает дефолты TypeScript 6.0 и превращает в жёсткие ошибки то, что в 6.0 было просто deprecated. Это значит: если вы ещё не перешли на TS6 с включённым stableTypeOrdering и без ignoreDeprecations — миграция на TS7 будет с правкой конфигов.

Изменения по умолчанию

  • strict: true по умолчанию.
  • module по умолчанию esnext.
  • target — текущая стабильная версия ECMAScript перед esnext.
  • noUncheckedSideEffectImports: true.
  • libReplacement: false.
  • stableTypeOrdering: true, выключить нельзя.
  • rootDir по умолчанию ./.
  • types по умолчанию []; старое поведение — ["*"].

Самые «неожиданные» изменения — rootDir и types. Если ваш tsconfig.json лежит вне директории src, нужно явно прописать rootDir:

			{
  "compilerOptions": {
    "rootDir": "./src"
  },
  "include": ["./src"]
}
		

А пакеты типа @types/node или @types/jest теперь нужно перечислять явно:

			{
  "compilerOptions": {
    "types": ["node", "jest"]
  }
}
		

Жёсткие ошибки вместо предупреждений

  • target: es5 больше не поддерживается.
  • downlevelIteration убран.
  • moduleResolution: node / node10 и classic — рекомендуют nodenext или bundler.
  • module: amd, umd, systemjs, none сняты.
  • baseUrl убран — пути в paths теперь относительно корня проекта.
  • esModuleInterop и allowSyntheticDefaultImports нельзя ставить в false.
  • alwaysStrict всегда true, переключить нельзя.
  • Ключевое слово module в namespace-объявлениях не работает.
  • asserts на импортах заменено на with (под import attributes из ECMAScript).
  • Директивы /// <reference no-default-lib /> не учитываются при включённом skipDefaultLibCheck.
  • Если в текущей директории есть tsconfig.json, CLI-сборка не принимает явные пути к файлам — нужно передать флаг --ignoreConfig.

JavaScript-файлы

Поддержку JS в TS7 переработали так, чтобы анализ JSDoc-кода был ближе к анализу .ts-файлов и без специальных случаев для Closure-стиля. Часть устоявшихся паттернов специально не распознаётся и требует переписать в современный TypeScript-синтаксис: значение там, где ожидается тип, заменяется на typeof someValue; одиночный ? как тип — на any; @enum, @class, постфиксный !, присваивание prototype и closure-сигнатуры function(string): void теперь не работают. Полный список различий команда ведёт в файле CHANGES.md в репозитории компилятора.

Как поставить рядом с TS 6.0

Beta лежит в пакете @typescript/native-preview, команда — tsgo. Это сделано специально, чтобы можно было гонять TS 6.0 и TS 7.0 параллельно и сравнивать результаты в одном проекте.

			npm install -D @typescript/native-preview@beta
npx tsgo --version
# Version 7.0.0-beta
npx tsgo
		

Стабильный релиз 7.0 поедет в пакет typescript и будет ставиться как обычный tsc. Чтобы при этом не сломать инструменты, ожидающие старый tsc через peer dependencies, команда выпустила compat-пакет @typescript/typescript6 с бинарём tsc6. Можно прицепить его через npm-алиас:

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

Или в package.json:

			{
  "devDependencies": {
    "typescript": "npm:@typescript/typescript6@^6.0.0"
  }
}
		

Стабильный программный API в TS 7.0 пока недоступен — его обещают только в релизе 7.1, через несколько месяцев после стабильной 7.0 (то есть осень 2026 или позже). До этого момента tooling, который использует TypeScript-API напрямую (typescript-eslint, ts-jest, ts-loader, ts-node), будет жить на TS6 — это главный стоппер для проектов, плотно завязанных на эти инструменты.

VS Code и редакторы

Для редактора есть отдельное расширение — TypeScript Native Preview для VS Code. Оно использует тот же бинарник, что и CLI, поэтому ускорение в редакторе идёт по тем же причинам. За месяцы превью добавили auto-imports, expandable hovers, inlay hints, code lenses, go-to-source-definition и JSX linked editing. Расширение ходит через Language Server Protocol, поэтому LSP-клиенты в редакторах вроде Neovim или Zed смогут подцепить его без специальной интеграции.

Кто уже на бете

Microsoft год обкатывала pre-release версии в командах с миллионными кодовыми базами. Внешние пользователи: Bloomberg, Canva, Figma, Google, Lattice, Linear, Miro, Notion, Slack, Vanta, Vercel, VoidZero и ещё несколько. Большинство сообщает, что время сборки сокращается в разы, а редактор стал заметно отзывчивее.

FAQ
1
Можно ли использовать TS 7.0 Beta в продакшене?

Тип-чекер структурно идентичен TS 6.0, прогнан через тестовый корпус, накопленный за десять лет, и уже работает на миллионных кодовых базах внутри Microsoft и в Slack, Figma, Notion, Vercel, Bloomberg. Команда TypeScript явно говорит: «не пугайтесь слова beta, можно начинать работать с ней прямо в ежедневных задачах». В CI и daily-сборках — реалистично, в hot-path продакшен-сборках — на ваше усмотрение.

2
Что будет с TypeScript 6.0 и есть ли переход?

TS 6.0 продолжит работать. Стабильный TS 7.0 выйдет под пакетом typescript и бинарём tsc, а под TS6 останется compat-пакет @typescript/typescript6 с tsc6. Параллельная установка — поддерживается официально.

3
Когда выйдет стабильная версия 7.0?

По плану команды — в течение двух месяцев после Beta, то есть примерно к концу июня 2026. Перед стабильным релизом будет Release Candidate — точка, после которой остаются только критичные фиксы.

4
Почему Go, а не Rust?

Команда TypeScript называла это в первоначальном анонсе портирования: цель была не «переписать», а «портировать». Структура Go ближе к существующей TypeScript-кодовой базе, и это позволило перенести логику чекера 1-в-1, а не воссоздавать с нуля. Rust дал бы выше пиковую производительность, но потребовал бы рерайта, а не порта. Tproger подробно разбирал ограничения этого решения — нативный компилятор не делает скомпилированный код быстрее, только саму сборку.

5
Будет ли TypeScript 7 работать в браузере?

Нативный tsgo — это бинарник Go, в браузере он сам по себе не запустится. Web-инструменты (TS Playground, online-чекеры) пока остаются на TS6-сборке, скомпилированной в JS. Команда не объявляла WASM-сборку tsgo и явных планов на неё нет.

Что делать прямо сейчас

  1. Откройте проект, оцените реальное время сборки (time tsc --noEmit) и редакторские задержки.
  2. Поставьте @typescript/native-preview@beta рядом с текущим TS6, прогоните npx tsgo на staging-ветке.
  3. Если проект ещё на TS5 — сначала перейдите на TS6 с stableTypeOrdering и без ignoreDeprecations. Без этого шага миграция на TS7 будет двойной.
  4. Проверьте конфиг на запрещённые в TS7 опции: target: es5, baseUrl, moduleResolution: node10, AMD-модули.
  5. В монорепо подберите --checkers и --builders под количество ядер CI-раннера.
  6. Если используете typescript-eslint или подобные инструменты — оставьте TS6 для них, TS7 только для сборки. Стабильный API появится в 7.1.

Выводы

TypeScript 7.0 Beta ускоряет сборку примерно в 10 раз без изменений в коде. Цена — пройтись по deprecated-флагам и обновиться до TS 6.0, если ещё не. Для проектов, где CI упирается в TypeScript, такая миграция окупается за неделю.

Tproger год назад писал о первых 10× на превью-сборке tsgo — тогда это были замеры одного бенчмарка. Сейчас у Microsoft рабочий бинарь, обкатанный в десятке крупных компаний.

Источники: Microsoft DevBlogs, microsoft/typescript-go, CHANGES.md.