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

TypeScript 7.1 Beta: мапперы контента для произвольных файлов и программный API

Каждый разработчик, собиравший сложные фронтенд-проекты на Vue, Svelte, Astro или MDX, прекрасно знает эту архитектурную боль. Пока ты пишешь чистый TypeScript в файлах .ts, компилятор tsc работает быстро, предсказуемо и надежно. Но стоит добавить в проект однофайловые компоненты (SFC) вроде .vue или .svelte, как привычный тулчейн дает трещину. Стандартный компилятор TypeScript наотрез отказывался понимать файлы с чужими расширениями, требуя громоздких внешних форков и утилит-оберток вроде vue-tsc или svelte-check.

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

Выход предварительной версии TypeScript 7.1 Beta знаменует фундаментальный перелом в архитектуре компилятора. Команда под руководством Андерса Хейлсберга внедрила механизм Content Mappers (мапперы контента) и публичный программный API компилятора, позволяющий напрямую обучать стандартный tsc валидации произвольных расширений файлов.

Как работают Content Mappers: виртуализация типов на лету

Давай разберем, что происходит под капотом компилятора при включении мапперов. Раньше архитектура tsc была намертво привязана к жесткому списку поддерживаемых расширений: .ts, .tsx, .d.ts, .js, .jsx. Любая попытка импортировать файл .vue требовала создания костыльного декларативного заглушечного файла shims-vue.d.ts со строкой declare module '*.vue', который напрочь отключал строгую проверку входных параметров (props) и внутренних событий компонента.

Механизм Content Mappers превращает парсинг файлов в расширяемый конвейер. Разработчик или автор фреймворка регистрирует в конфигурации tsconfig.json модуль-трансформер. Когда компилятор натыкается на импорт нестандартного файла, он не падает с ошибкой, а передает содержимое файла соответствующему мапперу.

Маппер прямо в оперативной памяти преобразует разметку компонента в виртуальное представление типов TypeScript: извлекает типы входных параметров, проверяет типы шаблонных слотов и сопоставляет возвращаемые структуры. При этом компилятор сохраняет строгую двустороннюю карту смещений (source mapping): если в шаблоне компонента на строке 15 передана строка вместо ожидаемого числа, tsc выведет понятную ошибку с указанием точной строки и колонки исходного .vue-файла, а не абстрактного сгенерированного промежуточного файла.

Конфигурация в tsconfig.json и запуск компиляции

Для подключения внешних мапперов в конфигурационный файл проекта добавляется новая секция mappers:

{
  "compilerOptions": {
    "target": "ES2024",
    "module": "NodeNext",
    "moduleResolution": "NodeNext",
    "strict": true,
    "mappers": {
      ".vue": "@vue/compiler-ts-mapper",
      ".svelte": "@sveltejs/tsc-content-mapper",
      ".mdx": "@mdx-js/ts-mapper"
    }
  },
  "include": ["src/**/*"]
}

Поскольку запуск сторонних мапперов означает исполнение внешнего JavaScript-кода в процессе компиляции, команда TypeScript ввела жесткие меры безопасности. По умолчанию вызов компилятора заблокирует выполнение незарегистрированных мапперов. Чтобы разрешить их запуск в среде сборки или на сервере непрерывной интеграции (CI), в CLI предусмотрен специальный защитный флаг --runExternalCode:

# Проверка типов в проекте с запуском внешних контент-мапперов
tsc --noEmit --runExternalCode

# Запуск инкрементальной сборки проекта в режиме наблюдения
tsc --build --watch --runExternalCode

Если попытаться вызвать tsc без этого флага в проекте с объявленной секцией mappers, компилятор немедленно остановит процесс с предупреждением о потенциальном риске исполнения стороннего кода, защищая окружение от атак на цепочку поставок (Supply Chain Attacks).

Программный API компилятора: интеграция в тулчейн

Вторым важным новшеством релиза стал открытый программный интерфейс ts.createProgramCompilerApi(). Раньше авторам инструментов сборки (Vite, Rollup, Webpack, Biome) приходилось прибегать к нестабильным внутренним приватным методам ядра TypeScript, которые регулярно ломались между минорными релизами.

Теперь компилятор предоставляет стабильный контракт, позволяющий программно скармливать файлы компилятору, получать абстрактное синтаксическое дерево (AST), запрашивать диагностику типов и перехватывать процесс эмиссии артефактов на лету.

Если тебе интересны практические детали внедрения этой технологии в экосистему компонентов, рекомендуем наш предыдущий разбор: TypeScript 7.1 Content Mappers: прямая проверка типов в Vue без vue-tsc, где детально показано, как этот механизм устраняет дублирование процессов парсинга в Vite.

Практические выводы для фронтенд-команд

Релиз TypeScript 7.1 знаменует долгожданный этап конвергенции веб-стандартов и экосистемы статической типизации. Для продуктовых команд это означает:

  • Ускорение CI-пайплайнов: Отказ от промежуточных компиляторов и утилит-оберток снижает общее время проверки типов в больших монорепозиториях на 30–45%.
  • Единый источник истины: Больше нет расхождений между тем, как типы видит языковой сервер редактора (LSP) и как их валидирует консольный раннер сборки.
  • Простота поддержки: Исчезает необходимость синхронизировать версии vue-tsc с минорными патчами самого TypeScript.

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