Типовий симптом після оновлення: десятки помилок «Cannot find name 'process'», «Cannot find name 'describe'», «Cannot find module 'fs'».
Причина - нове значення опції types за замовчуванням.
- До TypeScript 6: якщо
typesне вказано, компілятор автоматично підключав усі пакети зnode_modules/@typesяк глобальні декларації. Встановлено@types/node- іprocessдоступний будь-де. - TypeScript 6 і 7:
typesза замовчуванням - порожній масив. Жоден пакет@typesне підключається глобально сам по собі.
Рішення - перелічити потрібні глобальні типи явно:
{
"compilerOptions": {
"types": ["node", "jest"]
}
}
Або для різних частин проєкту - різні tsconfig (тести бачать vitest/globals, а код застосунку - ні).
Повернути стару поведінку можна значенням "types": ["*"], але команда TypeScript радить явний список.
Навіщо це змінили:
- швидкість: у сучасних репозиторіях
node_modules/@typesмістить сотні пакетів, підтягнутих транзитивно. Їх розбір і перевірка займали помітну частину збирання - за даними команди TypeScript, явнийtypesприскорював збирання багатьох проєктів на 20-50%; - передбачуваність: глобальні типи тестового фреймворку не «протікають» у код застосунку (у браузерному коді раптом доступний
describeчиprocess).
На що це НЕ впливає: на типи пакетів, які ви імпортуєте. import express from 'express' знайде @types/express як і раніше. Опція types стосується лише глобальних оголошень.
Інші зміни TypeScript 6/7, що дають схожі «раптові» помилки:
rootDirтепер за замовчуванням - каталог зtsconfig.json. Якщо код уsrc/, а результат раптом з'являється вdist/src/, треба вказати"rootDir": "./src";strict: trueза замовчуванням - проєкти, що покладалися на нестрогий режим, мають явно вказати"strict": false(краще - виправити помилки).
Порада: оновлюватися через TypeScript 6 - він показує попередження про застарілі налаштування, а TypeScript 7 робить їх помилками.