← Усі статті

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.

Коментарі

Завантаження коментарів…