Содержание
Коротко
Вышла бета 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 на своём срезе.
- Установите:
npm install -D typescript@beta. - Если импортируете JSON, текст, байты или CSS с
with { type: "…" }, опишите глобальные объявления модулей с теми же атрибутами — и уберите дублирующие*.md/*.txt, если оба означают текст. - Для wasm попробуйте
import source/import.sourceпри подходящих--moduleиlib. - В
tsconfigможно выставить"target": "es2026"/"lib": ["es2026", …]и проверить, какие объявления уже не нужно тянуть изesnext. - Авторам инструментов: разберите пример с
typescript/sync,usingи снимками; не смешивайте объекты из разных снимков. - Для Vue/Svelte/Astro следите за
contentMappersи флагом--runExternalCode— это отдельный контур доверия. - Перед выкаткой в основную ветку прогоните сценарии из раздела поведенческих изменений анонса (обновления 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.



Комментарии