Microsoft випустила бета-версію TypeScript 6.0
Команда Microsoft оголосила про вихід бета-версії TypeScript 6.0. Це остання версія, яка базується на поточному JavaScript-кодбейзі.
Як повідомлялося раніше, розробники працюють над повним переписуванням компілятора TypeScript на Go, щоб отримати переваги нативного коду та багатопотоковості.
Пощупати бету можна вже зараз:
npm install -D typescript@beta
Нижче розглянемо ключові нововведення та зміни, які приносить цей реліз.
Головні зміни
Покращений інференс для функцій без використання this
У TypeScript іноді виникали проблеми з виведенням типів, коли параметри функції не мали явних типів, але залежали від контексту. Це особливо проявлялося при використанні синтаксису методів об’єкта в порівнянні зі стрілковими функціями.
declare function callIt<T>(obj: {
produce: (x: number) => T,
consume: (y: T) => void,
}): void;
// Works, no issues.
callIt({
produce: (x: number) => x * 2,
consume: y => y.toFixed(),
});
// Works, no issues even though the order of the properties is flipped.
callIt({
consume: y => y.toFixed(),
produce: (x: number) => x * 2,
});
Раніше TypeScript не міг вивести тип y у методі consume, тому що методи неявно мають параметр this. Це змушувало компілятор сумніватися і пропускати контекстний аналіз для таких функцій на перших етапах, що призводило до типу unknown.
У TypeScript 6.0 тепер компілятор перевіряє, чи дійсно функція використовує this. Якщо this у тілі функції не використовується, вона більше не вважається контекстно-чутливою через цей параметр.
Тепер наведений вище код із синтаксисом методів працює без помилок.
Радикальні зміни у дефолтних налаштуваннях
TypeScript 6.0 оновлює значення за замовчуванням для багатьох опцій компілятора, щоб відповідати сучасним реаліям.
Найважливіші зміни:
Strictтеперtrueза замовчуванням.Moduleтеперesnextза замовчуванням.Typesтепер[](пустий масив) за замовчуванням. Раніше TypeScript автоматично підтягував усі пакети з@types/у глобальну область видимості. Це сповільнювало збірку. Тепер це вимкнено. Як наслідок тепер ви можете побачити помилки на кшталтCannot find name 'process'абоdescribe. Якщо побачили таке, то вам потрібно просто явно вказати необхідні типи уtsconfig.json:
{
"compilerOptions": {
"types": ["node", "jest"]
}
}
rootDirза замовчуванням — це папка зtsconfig.json. Раніше він вираховувався динамічно на основі спільних шляхів файлів, що було повільно і непередбачувано.
Підтримка нових стандартів: Temporal та методи «upsert»
TypeScript 6.0 додає типи для довгоочікуваних пропозицій ECMAScript, які досягли фінальних стадій.
Temporal API
Це нова глобальна API для роботи з датою та часом, яка має замінити застарілий об’єкт Date. Типи доступні через --target esnext або "lib": ["esnext"].
let yesterday = Temporal.Now.instant().subtract({
hours: 24,
});
let tomorrow = Temporal.Now.instant().add({
hours: 24,
});
console.log(`Yesterday: ${yesterday}`);
Методи getOrInsert для Map
Додано типи для нових методів Map та WeakMap, які спрощують патерн «перевір, чи є ключ, якщо ні — додай».
Раніше:
let strictValue: unknown;
if (compilerOptions.has("strict")) {
strictValue = compilerOptions.get("strict");
} else {
strictValue = true;
compilerOptions.set("strict", strictValue);
}
Тепер з getOrInsert:
let strictValue = compilerOptions.getOrInsert("strict", true);
Також є варіант getOrInsertComputed для важких обчислень значення за замовчуванням:
someMap.getOrInsertComputed("someKey", (key) => {
return computeSomeExpensiveValue(key);
});
Інші зміни
- Node.js дозволив використовувати імпорти, що починаються з
#/(наприклад,#root/utils.js) для аліасів всередині пакету. TypeScript 6.0 тепер підтримує це для опційmoduleResolution: node20,nodenextтаbundler. - Тепер налаштування
--moduleResolution bundlerта--module commonjsможна використовувати разом. - Додано спеціальний прапор
--stableTypeOrderingдля підготовки до переходу на TypeScript 7.0. Він робить генерацію внутрішніх ID типів детермінованою, як це буде в TS 7. Може сповільнювати збірку, тому рекомендується лише для діагностики. - Додано підтримку
target: es2025та відповідної бібліотекиlib. - Додано підтримку нової функції
RegExp.escapeдля безпечного екранування рядків у регулярних виразах (доступно вes2025):
const escapedWord = RegExp.escape(word);
const regex = new RegExp(`\\b${escapedWord}\\b`, "g");
- Вміст
dom.iterableтаdom.asynciterableтепер включено безпосередньо в основну лібуdom. Більше не потрібно дописувати їх окремо в налаштуваннях.
Видалення та застарілі штуки:
- Target ES5 — застарів. Мінімальний таргет тепер ES2015. Для ES5 потрібен зовнішній транспілятор.
- baseUrl — застарів. Рекомендується перенести налаштування в paths.
- outFile — видалено. Використовуйте бандлери.
- Синтаксис asserts — застарів. Замість import ... asserts { type: «json» } слід використовувати with { type: «json» }.
- moduleResolution: classic — видалено.
- Спроби запустити tsc file.ts у папці з tsconfig.json тепер викликатимуть помилку, бо потрібно використовувати прапор —ignoreConfig.
Нагадаємо, що раніше Microsoft повідомляла, що нативна версія TypeScript матиме продуктивність у 10 разів вищу за попередні версії.
Немає коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів