Новый компилятор TypeScript 7 на базе Go, tsgo, уже ломает популярные инструменты разработки, такие как ESLint, ts-jest и ts-morph. Проблемы будут сохраняться до тех пор, пока программный API компилятора не стабилизируется в предстоящем релизе 7.1. Это означает, что командам, полагающимся на эти инструменты, следует приостановить любые планы по обновлению.

Что изменилось в TypeScript 7

В этом релизе представлен tsgo — порт системы проверки типов на Go, получивший кодовое название Project Corsa. Благодаря переносу ядра с JavaScript на Go компилятор может выполнять сборку до десяти раз быстрее — этот заголовок привлек ранних последователей, стремящихся сократить время работы CI-конвейеров.

Почему инструменты выходят из строя

Инструменты, работающие с TypeScript, не взаимодействуют с системой проверки типов напрямую. Они вызывают набор внутренних API, которые предоставляют информацию о типах, диагностику и обход AST. Эти API были переписаны для tsgo и остаются в процессе изменения до версии 7.1. Результатом становится каскад сбоев и скрытых ошибок:

  • typescript-eslint – npm отказывается устанавливать его вместе с TypeScript 7; принудительная установка приводит к ошибке TypeError в ESLint.
  • ts-jest – пытается вызвать внутренние методы, которых больше нет в версии на Go, что приводит к прерыванию трансформации тестовых файлов.
  • ts-morph – ожидает стабильный API для обхода структуры кода; с текущим API он может возвращать неверные результаты или завершаться ошибкой без предупреждения.
  • Monorepos – tsgo отбрасывает некоторые параметры обобщенных типов (generic type parameters), что приводит к ошибкам типизации, которые проявляются только в крупных многопакетных проектах.

Любой рабочий процесс, сочетающий линтинг, тестирование Jest или анализ кода с TypeScript 7, скорее всего, приведет к «красным» сборкам.

Кого это касается

  • Front-end команды, использующие ESLint в каждом pull request.
  • Back-end сервисы, полагающиеся на ts-jest для юнит-тестирования.
  • Библиотеки, использующие ts-morph для генерации кода или документации.
  • Организации с монорепозиториями, где вывод типов (type inference) уже является сложным процессом.

Если ваш CI-конвейер стал «красным» после обновления TypeScript, причиной, скорее всего, является один из вышеперечисленных факторов.

Безопасный путь миграции до версии 7.1

Самый простой способ сохранить выигрыш в скорости, не ломая инструменты, — это отделить быстрый этап проверки типов от самой сборки:

  1. Зафиксируйте основную версию TypeScript на 6.x — это сохранит стабильный API, который ожидают все инструменты.
  2. Добавьте @typescript/native-preview в качестве dev-зависимости — этот пакет поставляет бинарный файл tsgo для быстрой проверки типов в CI.
  3. Запускайте tsgo с флагом --noEmit для быстрой проверки — он проверяет типы, но не создает выходные файлы.
  4. Используйте классический компилятор tsc для реальных сборокtsc по-прежнему генерирует JavaScript и соблюдает API версии 6.x.
npm install -D typescript@^6.9
npm install -D @typescript/native-preview

Обновите скрипты в вашем package.json:

{
  "scripts": {
    "typecheck:fast": "tsgo --noEmit",
    "build": "tsc"
  }
}

Благодаря такой двойной настройке вы сохраните десятикратное ускорение в CI, обеспечивая при этом совместимость с ESLint, ts-jest и ts-morph.

Когда можно обновляться сразу до 7.0

Если ваш кодовый базис использует только tsc — без линтинга, Jest или ts-morph — то нестабильный API вас не коснется. В этом узком сценарии вы можете немедленно перейти на TypeScript 7 и наслаждаться приростом производительности без дополнительных шагов.

На что обратить внимание

  • Версия 7.1 — команда TypeScript дала понять, что программный API будет заморожен в этом релизе. Как только он выйдет, «мостик» между tsgo и существующими инструментами исчезнет, что позволит выполнить чистое обновление.
  • Обновления инструментов — следите за новыми релизами typescript-eslint, ts-jest и ts-morph. Они выпустят совместимые версии вскоре после выхода 7.1.
  • Конфигурация CI — не забудьте заменить tsgo --noEmit на обычный вызов tsc, как только API стабилизируется; пакет preview больше не понадобится.

Итог: До фиксации API в версии 7.1 используйте TypeScript 6.x в качестве основного компилятора, добавьте @typescript/native-preview для быстрой проверки и продолжайте использовать tsc для сборок. Это позволит избежать проблем с линтингом и тестированием, сохраняя при этом преимущества производительности нового движка на Go.