Дайджесты новостей
Высокотехнологичная взрыв-схема механизма параллельного компилятора TypeScript tsrs на Rust с блоками аренной аллокации памяти Bump Allocation.

Эволюция TypeScript: новый API в версии 7.1 Beta и компилятор tsrs на Rust

Каждый, кто работал в крупном enterprise-монорепозитории на сотни тысяч строк TypeScript, не понаслышке знает главную боль современного фронтенда: скорость компилятора tsc.

Ты поправил одну строчку кода, нажал сохранить, сборщик Vite или Turbopack на лету пересобрал бандл за 50 миллисекунд, но чтобы запустить валидацию типов перед коммитом через tsc --noEmit, приходится ждать полторы-две минуты. В результате разработчики начинают отключать тайпчекинг в локальных прекоммит-хуках, перекладывая проверку на медленный CI/CD, где очереди тестов растягиваются на часы.

Причина этой проблемы фундаментальна: официальный компилятор tsc написан на самом TypeScript и выполняется в однопоточном рантайме Node.js. Сборщик мусора V8 постоянно тратит драгоценные миллисекунды на аллокацию и очистку миллионов мелких AST-узлов и структур типов.

Сегодня развитие TypeScript движется по двум параллельным и захватывающим траекториям:

  1. Эволюция типовой системы от Microsoft: официальная бета-версия TypeScript 7.1 Beta, принесшая долгожданную поддержку атрибутов импорта в файлах деклараций и оптимизацию вложенных union-типов.
  2. Аппаратная революция на Rust: амбициозный проект tsrs, создающий независимый параллельный тайп-чекер на Rust с целью ускорить валидацию типов в 10–20 раз.

Давай детально разберем оба крыла этой инженерной эволюции.

Что нового в TypeScript 7.1 Beta?

Команда Андерса Хейлсберга в Microsoft продолжает полировать типовую систему, внедряя свежие стандарты комитета TC39.

1. Атрибуты импорта (Import Attributes) в амбиентных модулях

Стандарт ECMAScript утвердил синтаксис атрибутов импорта: import data from './data.json' with { type: 'json' }. Это критически важная мера безопасности: атрибут гарантирует, что среда выполнения выполнит строгую проверку MIME-типа и откажется исполнять файл, если злоумышленник попытается подсунуть исполняемый JavaScript под видом JSON.

Однако до версии 7.1 разработчики не могли типизировать подобные импорты в файлах деклараций (.d.ts). В TypeScript 7.1 Beta ключевое слово with получило первоклассную поддержку в амбиентных объявлениях:

// ambient-declarations.d.ts — поддержка Import Attributes в TS 7.1 Beta
declare module "*.json" with { type: "json" } {
  const data: {
    readonly version: string;
    readonly features: Record<string, boolean>;
  };
  export default data;
}

declare module "*.wasm" with { type: "webassembly" } {
  const module: WebAssembly.Module;
  export default module;
}

Теперь при попытке импортировать файл без обязательного атрибута компилятор выдаст строгую ошибку типов еще до сборки:

// app.ts
// УСПЕШНО: тип строго совпадает с амбиентной декларацией
import appConfig from './appsettings.json' with { type: 'json' };

// ОШИБКА TS: Отсутствует атрибут with { type: 'json' }
// import badConfig from './appsettings.json';
2. Оптимизация памяти при глубоких типах союзов (Union Types)

В сложных библиотеках валидации схем (вроде Zod, ArkType или TypeBox) генерация сложных союзов из десятков вариантов часто приводила к исчерпанию лимита памяти Node.js (JavaScript heap out of memory) и драматическому падению скорости тайпчекинга. В 7.1 алгоритм нормализации объединений был переписан: компилятор использует структурный шеринг дескрипторов (Structural Sharing) и кэширование нормализованных сигнатур, снизив потребление RAM на 12–15% на тяжелых кодовых базах.

3. Стабилизация режима Isolated Declarations

Еще один важнейший шаг — дальнейшее развитие флага isolatedDeclarations: true. Этот режим требует, чтобы экспортируемые функции и переменные имели явные аннотации типов. За счет этого внешние быстрые сборщики (Oxlint, Rspack, esbuild) могут мгновенно генерировать файлы типов .d.ts без необходимости запускать тяжелый семантический анализ всего графа проекта.

О том, как параллельные линтеры ускоряют проверки в связке с типизацией, мы ранее рассказывали в разборе стабильного Type-Aware линтинга в Oxlint.

Проект tsrs: переосмысление Type Checker на Rust

Пока Microsoft развивает спецификацию языка, сообщество высокопроизводительных инструментов взялось за решение главной боли — скорости работы ядра.

Инженерная схема аренной аллокации памяти Bump Allocation в компиляторе tsrs на Rust: последовательное заполнение арены AST-узлами с мгновенной очисткой.

Проект tsrs — это полноценный компилятор и тайп-чекер TypeScript, разрабатываемый на языке Rust.

В чем фундаментальное отличие архитектуры tsrs от tsc?

1. Аренная аллокация памяти (Memory Arenas / Bump Allocation)

В классическом tsc каждый узел абстрактного синтаксического дерева (AST) и каждый тип — это отдельный объект в куче V8. В tsrs используется крейт typed-arena: память под AST и таблицы символов выделяется огромными непрерывными блоками (Arenas). Создание нового типа сводится к сдвигу одного указателя в памяти (Bump Allocation). А когда файл проверен, вся арена освобождается за одну машинную операцию без нагрузки на сборщик мусора.

2. Настоящий параллелизм (Multi-threaded Type Checking)

Движок Node.js однопоточен. tsrs использует пул рабочих потоков на базе библиотеки rayon и архитектуру акторов:

  • Парсинг сотен файлов исходников происходит параллельно по всем ядрам процессора.
  • Фаза разрешения модулей (Module Resolution) выполняется асинхронно без блокировок.
  • Граф зависимостей типов разделяется между потоками через структуры данных со свойствами Read-Only/Copy-on-Write.

Вот как выглядит вызов tsrs в терминале:

# Проверка типов в проекте на 200 000 строк кода
# Классический tsc: 78.4 секунды
# tsrs на 16-ядерном процессоре: 4.2 секунды!
tsrs check --project tsconfig.json --threads 16

Текущий статус и взгляд в будущее

Важно трезво оценивать зрелость обоих проектов:

  • TypeScript 7.1 Beta — стабильный, надежный инструмент от авторов языка, который уже готов к тестированию в рабочих проектах и станет стандартом через несколько недель.
  • tsrs — находится в фазе активного развития. На сегодняшний день компилятор проходит около 75% официального тестового набора соответствия (Conformance Test Suite) репозитория TypeScript. Главная сложность — поддержка редких краевых случаев вывода типов в сложных условных типах (Conditional Types).

Однако вектор развития предельно ясен: веб-инструменты окончательно переходят на нативный компилируемый код. И появление быстрого тайп-чекера на Rust станет финальным элементом мозаики, который сделает разработку на TypeScript по-настоящему мгновенной.