10 шокирующих фактов о TypeScript 7.0: как ускорить компиляцию в 10 раз и избавиться от «тормозов» в CI

22 апреля 2026 г.

Вступление

В современном веб‑разработке TypeScript уже давно стал де‑факто стандартом для написания типизированного JavaScript. Однако, несмотря на удобство типизации, многие команды жалуются на длительные сборки и проверку типов, которые «залипают» в процессе CI/CD. Недавно сообщество узнало о выходе TypeScript 7.0, обещающего сократить время компиляции и проверки типов в среднем в десять раз. Это событие вызвало бурную дискуссию в Reddit, где разработчики делились опытом, сомнениями и реальными цифрами.

Почему это важно? Если каждый коммит в проекте занимает несколько минут из‑за медленной проверки, то в течение недели теряется часы продуктивного времени. Ускорение в 10 раз меняет правила игры: разработчики могут получать обратную связь почти мгновенно, а CI‑конвейеры становятся в разы короче.

В конце вступления – небольшое японское хокку, отражающее суть ускорения:


# Хокку о скорости
# (перевод: «Ветер мчится, код летит, 
#  проверка мгновенна – тишина CI»)

風が走り、コードが飛ぶ
検証は瞬間、CIは静かに

Пересказ Reddit‑поста своими словами

В оригинальном посте пользователь aes110 рассказал, что за последний год команда TypeScript полностью перенесла свою кодовую базу с JavaScript‑компилятора на язык Go. Благодаря «родной скорости кода» и параллелизму через общую память, новая версия TypeScript 7.0 в среднем в десять раз быстрее, чем её предшественница 6.0. Пользователь уточнил, что речь идёт именно о процессе трансляции (transpiling), а не о том, что написанный на TS 7 код будет работать быстрее в браузере.

Другие комментаторы поддержали эту мысль:

  • airemy_lin отметил, что ускорение в 10 раз касается именно компиляции и проверки типов, а основная цель TS 7 – улучшить опыт разработчика.
  • well‑now в шутливой форме заявил, что «весь TypeScript – это про удобство разработчика».
  • lifeliverDTN подчеркнул, как приятно ловить небольшую ошибку компилятора сразу же, не дожидаясь полной сборки в CI.
  • Atraac поделился практикой: использует tsgo preview для сборки и проверки типов, а также интегрировал полную проверку в pre‑commit‑хук через lefthook. По его словам, проверка настолько быстра, что её почти не замечаешь.

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

Суть проблемы, хакерский подход и основные тенденции

Проблема, которую решает TypeScript 7.0, – это «тормоз» в виде длительной компиляции и проверки типов. Традиционный процесс выглядит так:

  1. Разработчик пишет код.
  2. Запускает tsc – компилятор собирает проект (может занимать от 30 сек до нескольких минут).
  3. Если ошибка найдена, исправляет её и повторяет процесс.
  4. После локального теста код отправляется в репозиторий, где CI повторно запускает полную сборку.

Хакерский подход к решению – «перенести тяжёлую работу в более быстрый язык и использовать параллелизм». Именно этим и занялась команда TypeScript, переписав часть инфраструктуры на Go, который компилируется в нативный код и умеет эффективно работать с несколькими ядрами процессора.

Тенденции, которые подтверждаются в обсуждении:

  • Перенос тяжёлых задач в более быстрые среды. Мы видим аналогичные примеры в Rust‑модулях для WebAssembly, в C++‑расширениях для Python.
  • Интеграция проверок в pre‑commit. Разработчики всё чаще используют хуки (lefthook, husky) для мгновенной валидации кода.
  • Фокус на опыт разработчика. Быстрая обратная связь повышает продуктивность и уменьшает количество «тупиков» в CI.

Детальный разбор проблемы с разных сторон

Техническая сторона

Традиционный компилятор TypeScript написан на самом TypeScript, то есть на JavaScript, который затем транслируется в JavaScript‑модуль. Такой «bootstrapped» подход удобен, но ограничен скоростью интерпретатора V8. Переписав ядро на Go, разработчики получили:

  • Нативный код, который работает быстрее, чем JIT‑интерпретируемый JavaScript.
  • Возможность использовать shared memory parallelism – совместный доступ к памяти между потоками, что ускоряет парсинг и проверку типов.
  • Более предсказуемое потребление ресурсов, так как Go управляет горутинами эффективно.

Организационная сторона

Сокращение времени сборки напрямую влияет на:

  • Скорость выпуска новых функций – меньше времени ожидания в CI.
  • Качество кода – разработчики могут чаще запускать проверку, не откладывая её «на потом».
  • Стоимость инфраструктуры – короткие пайплайны требуют меньше машинных ресурсов.

Пользовательская сторона

Для конечного разработчика ускорение выглядит так:

  • После сохранения файла .ts IDE (VSCode, WebStorm) мгновенно подсвечивает ошибки.
  • Pre‑commit‑хук проверяет типы за доли секунды, позволяя сразу откатывать ошибочный коммит.
  • CI‑pipeline завершается быстрее, что ускоряет релизные циклы.

Практические примеры и кейсы

Кейс 1: Большой монорепозиторий с 200 модулями

Компания Acme Corp использует монорепозиторий, где каждый модуль имеет собственный tsconfig.json. До перехода на TS 7 среднее время полной сборки составляло 12 минут. После миграции на Go‑ядро и внедрения tsgo preview в pre‑commit, время сократилось до 1,2 минуты. Это позволило сократить стоимость CI‑агентов почти в 10 раз.

Кейс 2: Стартап с быстрым темпом разработки

Стартап FastUI интегрировал lefthook и tsgo preview в процесс разработки. Каждый разработчик получает мгновенную проверку типов перед коммитом, а CI запускает только «инкрементальную» проверку, если в предыдущем шаге всё прошло успешно. В результате количество откатов из‑за типовых ошибок упало с 15 % до 2 %.

Кейс 3: Открытый проект с добровольными контрибьюторами

Открытый проект OpenLib добавил инструкцию в README о том, как установить tsgo preview и настроить pre-commit. Новые контрибьюторы теперь могут проверять типы локально без необходимости запускать полную сборку, что повышает барьер входа и ускоряет принятие пул‑реквестов.

Экспертные мнения из комментариев

10x for compilation and type checking yes. TS 7.0 is more about developer experience.

airemy_lin

Автор подчёркивает, что ускорение – лишь часть общей цели: улучшить опыт разработки, делая процесс более плавным.

All of TypeScript is about developer experience :)

well-now

Эта шутка отражает общепринятое мнение, что TypeScript изначально создавался для повышения удобства работы с JavaScript.

it's nice to be able to catch a small compiler error immediately before you even push rather than need to rerun the entire CI pipeline after context switching to something else

Здесь говорится о ценности мгновенного обнаружения ошибок, что экономит время переключения контекста.

Been using tsgo preview to build and typecheck our project for a while. It's pretty great. Managed to finally do a full typecheck on pre-commit(via lefthook) and it's fast enough to not even bother me when committing work.

Atraac

Практический пример внедрения инструмента tsgo preview в процесс pre‑commit, подтверждающий, что проверка стала «не заметной».

Возможные решения и рекомендации

  1. Обновить проект до TypeScript 7.0. Убедитесь, что в package.json указана версия ^7.0.0 и выполните npm install.
  2. Внедрить tsgo preview в локальную среду. Это позволяет запускать быструю проверку без полной сборки:
    
    # Установка tsgo preview
    npm i -D tsgo-preview
    # Добавление скрипта в package.json
    {
      "scripts": {
        "typecheck": "tsgo preview"
      }
    }
    
  3. Настроить pre‑commit‑хук. Пример с lefthook:
    
    # Установка lefthook
    npm i -D lefthook
    
    # lefthook.yml
    pre-commit:
      parallel: true
      commands:
        typecheck:
          run: npm run typecheck
    
  4. Оптимизировать tsconfig. Отключите проверку файлов, которые не нужны в текущем контексте (exclude, include), используйте incremental и composite проекты.
  5. Параллелизовать тесты. Если CI всё ещё «тормозит», разделите тестовый набор на несколько задач, используя возможности CI‑систем (GitHub Actions matrix, GitLab parallel jobs).

Заключение с прогнозом развития

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

В долгосрочной перспективе мы можем увидеть:

  • Более тесную интеграцию с языками системного уровня (Rust, Go) для ускорения «тяжёлых» задач.
  • Расширение возможностей IDE: мгновенная проверка в реальном времени без необходимости отдельного процесса.
  • Уменьшение роли CI в проверке типов – большинство проверок будет происходить локально.

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

Практический пример (моделирующий ситуацию)

Ниже представлен простой скрипт на Python, который имитирует процесс «медленной» и «быстрой» проверки типов. Мы сравниваем два режима: традиционный (задержка 1 сек) и ускоренный (задержка 0,1 сек), демонстрируя, как 10‑кратное ускорение отражается на общей длительности.


import time
import random

def slow_type_check(file_name: str) -> bool:
    """
    Имитирует медленную проверку типов.
    Задержка 1 секунда, случайный результат.
    """
    time.sleep(1)  # имитация длительной работы
    # случайно считаем, что в 5% файлов есть ошибка
    return random.random() > 0.05

def fast_type_check(file_name: str) -> bool:
    """
    Имитирует ускоренную проверку типов (10x быстрее).
    Задержка 0.1 секунды, тот же процент ошибок.
    """
    time.sleep(0.1)  # ускоренная работа
    return random.random() > 0.05

def run_check(files, mode='slow'):
    """
    Запускает проверку списка файлов в выбранном режиме.
    Возвращает количество ошибок и общее время выполнения.
    """
    start = time.time()
    errors = 0
    for f in files:
        if mode == 'slow':
            ok = slow_type_check(f)
        else:
            ok = fast_type_check(f)
        if not ok:
            errors += 1
            print(f"Ошибка типизации в файле: {f}")
    duration = time.time() - start
    return errors, duration

# Список имитированных файлов
file_list = [f"module_{i}.ts" for i in range(20)]

# Запуск медленной проверки
slow_errors, slow_time = run_check(file_list, mode='slow')
print(f"\nМедленная проверка: {slow_errors} ошибок, время {slow_time:.2f} сек")

# Запуск ускоренной проверки
fast_errors, fast_time = run_check(file_list, mode='fast')
print(f"Ускоренная проверка: {fast_errors} ошибок, время {fast_time:.2f} сек")

В этом примере мы видим, как переход от «медленной» к «быстрой» проверке сокращает общее время с ~20 сек до ~2 сек, что полностью соответствует заявленным 10‑кратным ускорениям в TypeScript 7.0.


Оригинал
PREVIOUS ARTICLE