Microsoft випустила бета-версію TypeScript 6.0

💡 Усі статті, обговорення, новини про Front-end — в одному місці. Приєднуйтесь до Front-end спільноти!

Команда 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 разів вищу за попередні версії.

👍ПодобаєтьсяСподобалось3
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Підписатись на коментарі