Microsoft объявила о выходе TypeScript 7.0, одного из самых значительных обновлений в истории языка. В отличие от многих прошлых релизов, главная новость на этот раз не в длинном списке синтаксических возможностей. TypeScript 7.0 ориентирован на скорость.

Ключевым нововведением стал нативный порт компилятора TypeScript и сопутствующих инструментов, написанный на Go. По заявлению Microsoft, нативная реализация даёт производительность нативного кода, многопоточность с разделяемой памятью и оптимизации, ускоряющие полную сборку крупных проектов от 8 до 12 раз.

Microsoft утверждает, что TypeScript 7.0 разработан с сохранением совместимости с текущим компилятором, несмотря на переход к нативному коду. Новый порт на Go написан максимально близко к исходной кодовой базе: там, где это возможно, сохранена структура и логика, чтобы обеспечить согласованные результаты между старым и новым компиляторами.

Цифры производительности выглядят более чем впечатляюще. В тестах Microsoft время сборки кодовой базы VS Code сократилось с 125,7 секунды на TypeScript 6.0 до 10,6 секунды на TypeScript 7.0, что дало ускорение в 11,9 раза. Sentry ускорился со 139,8 до 15,7 секунды, а проекты Bluesky, Playwright и tldraw стали быстрее от 7,7 до 8,9 раза.

TypeScript 7 теперь в 10 раз быстрее.
TypeScript 7 теперь в 10 раз быстрее.

Потребление памяти тоже улучшилось. В тех же тестах TypeScript 7.0 потреблял меньше памяти на всех крупных проектах, снижая расход от 6 до 26%.

Реакция редактора также улучшилась. По данным Microsoft, при открытии файла с ошибкой в кодовой базе VS Code раньше требовалось около 17,5 секунды до появления первого сообщения об ошибке. С TypeScript 7.0 это время сократилось до 1,3 секунды, то есть более чем в 13 раз быстрее.

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

Для монорепозиториев и проектов со ссылками на проекты в TypeScript 7.0 добавлен новый флаг --builders, позволяющий запускать несколько построителей одновременно. Однако Microsoft предупреждает, что взаимодействие между --checkers и --builders требует осторожности, так как одновременное увеличение обоих может кратно увеличить число активных воркеров проверки типов.

Также появилась опция --singleThreaded, полностью отключающая параллелизм. Она пригодится для отладки, сравнения поведения между версиями TypeScript или сборки в ограниченных средах, где запуск дополнительных воркер-процессов нежелателен.

Ещё одно важное улучшение касается полностью переработанного режима --watch. TypeScript 7.0 теперь использует новую основу для отслеживания файлов, построенную на вотчере Parcel, перенесённом на Go.

Изменились и некоторые настройки конфигурации. TypeScript 7.0 наследует новые значения по умолчанию из TypeScript 6.0 и превращает ранее устаревшие опции в жёсткие ошибки. В частности, strict теперь включён по умолчанию, module по умолчанию равен esnext, а stableTypeOrdering включён и отключить его нельзя.

Помимо улучшений производительности и изменений конфигурации, TypeScript 7.0 обеспечивает более естественную обработку кодовых точек Unicode в типах строковых литералов. Раньше некоторые символы Unicode, представленные суррогатными парами, могли разделяться способом, который формально соответствовал индексации JavaScript в UTF-16, но не тому, что обычно ожидали разработчики. Теперь TypeScript 7.0 обрабатывает такие случаи более естественно при выводе типов.

Подробнее можно узнать в официальном анонсе в блоге Microsoft для разработчиков.

Изображение: Microsoft