← Все статьи

TypeScript 7.1 бета: атрибуты импорта, фаза source и новый API

Бета TypeScript 7.1: атрибуты в глобальных объявлениях модулей, импорты на фазе source, цель es2026, программный API со снимками и ускорение проверок.

TypeScript 7.1 бета: атрибуты импорта, фаза source и новый API
Содержание

Коротко

Вышла бета TypeScript 7.1. Ставят так: npm install -D typescript@beta.

Главное для повседневной работы с модулями: атрибуты импорта (with { type: "json" } и соседи) теперь можно описать в глобальных объявлениях модулей — типы следуют за ярлыком, а не только за расширением файла.

Рядом — импорты на фазе source для WebAssembly и будущих сценариев, стабильная цель es2026, новый программный API со снимками состояния и заметное ускорение проверки типов на крупных кодовых базах.

Что произошло

Представьте посылку на таможне. На коробке написано .md или .css, но открывать её нужно по штампу: текст, сырые байты или таблица стилей. Раньше в TypeScript часто объявляли declare module "*.css" и надеялись на расширение. Среда выполнения смотрит на атрибут with { type: "…" }, а не на суффикс имени.

В 7.1 глобальные объявления модулей принимают тот же with. Можно написать declare module "*" with { type: "css" } и получить CSSStyleSheet, для "text" — строку, для "bytes" — Uint8Array. Без нужного атрибута импорт станет ошибкой. Шаблоны по расширению больше не дублируют одно и то же для .txt и .md, если оба идут как текст.

Эти объявления не входят в встроенные библиотеки TypeScript: их кладут в свой проект. Так проще не конфликтовать с lib.dom или @types/node.

Вторая новинка — импорты на фазе source: import source SuperFastThing from "./mod.wasm". На выходе — представление модуля после разбора, но до загрузки его зависимостей. Для WebAssembly это WebAssembly.Module, его сразу передают в WebAssembly.instantiate. Есть и динамический вариант: import.source("…"). Нужны подходящие --module (esnext / nodenext / preserve) и esnext в --lib или --target.

Цель и библиотека es2026 стали стабильными. В lib переехали, среди прочего, Math.sumPrecise(), Array.fromAsync(), toBase64 / toHex у Uint8Array, getOrInsert у Map / WeakMap. В esnext добавлены предложения вроде Promise.allKeyed и нескольких методов Iterator.

Отдельно — новый программный API. Вместо монолита точками входа стали typescript/sync, typescript/async, typescript/fs, typescript/ast и вспомогательные модули. Клиент и программа — Disposable: их закрывают явно или через using, иначе утекает память на стороне Go. Для длинных сессий есть снимки (createSnapshot / update): меняете слой файловой системы и переиспользуете работу компилятора, не собирая мир с нуля. Сюда же входят преобразователи содержимого (contentMappers) — первая линия поддержки вложенного JS/TS в .vue, Svelte, Astro и подобных форматах.

По производительности: после рывка 7.0 (~10× к 6.0) бета 7.1 жмёт память и время ещё сильнее. На замерах команды при четырёх потоках проверки и --noEmit mui-docs ускорился примерно в 1,9× (память почти −50%), vscode — около 1,2× по времени и −17% по памяти. Список внутренних оптимизаций длинный: от переиспользования программ при правке одного файла до уплотнения структур проверщика.

Почему это важно

Атрибуты импорта уже живут в браузерах и сборщиках. Пока типы игнорировали with, легко забыть атрибут или получить «не ту» форму модуля: сборщик по умолчанию тянет CSS-модули, а браузер ждёт CSSStyleSheet. Типы, завязанные на атрибут, закрывают этот разрыв раньше среды выполнения.

Импорты на фазе source дают предсказуемый путь для wasm-плагинов без «магии» загрузчиков. es2026 как стабильная цель убирает сюрпризы при обновлении lib. Новый API и снимки — сигнал авторам линтеров, языковых сервисов и CLI: можно строить инструменты на публичных точках входа, а не на хрупких обходах.

Ускорение и меньший аппетит к памяти на больших репозиториях напрямую бьют по циклу «сохранил — подождал диагностики». Для монорепо это ощутимее любого косметического синтаксиса.

На практике

Сначала поставьте бету в отдельную ветку и сравните tsc --noEmit с 7.0 на своём срезе.

  1. Установите: npm install -D typescript@beta.
  2. Если импортируете JSON, текст, байты или CSS с with { type: "…" }, опишите глобальные объявления модулей с теми же атрибутами — и уберите дублирующие *.md / *.txt, если оба означают текст.
  3. Для wasm попробуйте import source / import.source при подходящих --module и lib.
  4. В tsconfig можно выставить "target": "es2026" / "lib": ["es2026", …] и проверить, какие объявления уже не нужно тянуть из esnext.
  5. Авторам инструментов: разберите пример с typescript/sync, using и снимками; не смешивайте объекты из разных снимков.
  6. Для Vue/Svelte/Astro следите за contentMappers и флагом --runExternalCode — это отдельный контур доверия.
  7. Перед выкаткой в основную ветку прогоните сценарии из раздела поведенческих изменений анонса (обновления DOM-типов, более строгие дистрибутивные параметры).
Тема Что проверить
Атрибуты импорта Ошибка без with, верный тип с with
Фаза source wasm + WebAssembly.instantiate
es2026 Нужные методы в lib, без лишнего esnext
API / снимки dispose / using, слой файловой системы при правках
Производительность Время и память tsc --noEmit против 7.0

Итог

Бета TypeScript 7.1 дотягивает систему типов до того, как модули реально грузятся в 2026-м: ярлык на посылке важнее суффикса на коробке.

Плюс стабильный es2026, вход для wasm через фазу source, программный API со снимками и ещё один виток скорости поверх 7.0.

Имеет смысл поставить typescript@beta на CI-ветке сейчас — пока окно обратной связи открыто, а не после GA.

Комментарии

Загрузка комментариев…