Новый компилятор 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
Самый простой способ сохранить выигрыш в скорости, не ломая инструменты, — это отделить быстрый этап проверки типов от самой сборки:
- Зафиксируйте основную версию TypeScript на 6.x — это сохранит стабильный API, который ожидают все инструменты.
- Добавьте
@typescript/native-previewв качестве dev-зависимости — этот пакет поставляет бинарный файл tsgo для быстрой проверки типов в CI. - Запускайте tsgo с флагом
--noEmitдля быстрой проверки — он проверяет типы, но не создает выходные файлы. - Используйте классический компилятор
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.
