Главная / Статьи / Изменения по умолчанию в TypeScript 6.0: практическое руководство по миграции

Изменения по умолчанию в TypeScript 6.0: практическое руководство по миграции

Узнайте, какие девять настроек компилятора TypeScript 6.0 изменились по умолчанию, как настроить tsconfig для 2026 года и как подготовить кодовые базы к использованию TypeScript 7, основанного на Go.

805 слов

Если при сборке недавно начали появляться ошибки в режиме moduleResolution: node, это не означает, что у вас что-то сломалось. TypeScript 6.0 тихо изменил девять настроек компилятора по умолчанию, и команды, отложившие обновление, теперь сталкиваются со всеми этими изменениями одновременно. Проще говоря: это обновление нельзя откладывать бесконечно. TypeScript 6.0 — это последняя версия, созданная на основе первоначального компилятора, основанного на JavaScript. TypeScript 7 представляет собой полностью переписанный вариант, написанный на языке Go, и по предварительным данным скорость компиляции может увеличиться в 10 раз по сравнению с текущей версией.

Что именно изменилось

  1. Режим строгости включен по умолчанию. Любой новый проект, создаваемый сейчас, автоматически наследует параметр strict: true. Если вы обслуживаете старый кодовый базис, ожидайте появления множества новых диагностических сообщений, связанных с косвенными типами any и проверками на возможность значения null, которые ранее оставались незамеченными.
  2. Целевая версия компиляции изменилась с ES3 на ES2022. Практически никто не использовал вывод в формате ES3, но если ваша сборочная цепочка не указывала конкретную целевую версию, это изменение влияет на код, который компилятор генерирует по умолчанию.
  3. ESM становится стандартной системой модулей. Кодовые базисы, которые по-прежнему активно используют функции require(), должны тщательно пересмотреть свою стратегию работы с модулями, поскольку предположения, заложенные в компилятор, больше не фаворизируют формат CommonJS.
  • moduleResolution: node теперь считается устаревшим. Рекомендуемым решением является переход на bundler или nodenext, поскольку механизм разрешения модулей в стиле bundler теперь соответствует способу, которым инструменты вроде Vite на практике разрешают модули.
  • --outFile вместе с форматами вывода AMD, UMD и SystemJS больше не поддерживаются. Если ваш процесс сборки всё ещё использует один из этих форматов, TypeScript 6.0 пока не готов для вашего проекта.
  • Ключевое слово assert для атрибутов импорта заменено на with.
  • Рекомендуемая конфигурация tsconfig для 2026 года

    {
      "compilerOptions": {
        "target": "ES2022",
        "module": "ESNext",
        "moduleResolution": "bundler",
        "isolatedDeclarations": true,
        "strict": true,
        "noUncheckedIndexedAccess": true,
        "exactOptionalPropertyTypes": true,
        "skipLibCheck": true
      }
    }
    

    Применение этой конфигурации в нескольких средних по размеру проектах на React и Next.js в этом квартале привело к появлению ошибок, которые почти всегда были настоящими багами, а не ложными срабатываниями.

    Новый флаг stableTypeOrdering

    Этот флаг не привлекает должного внимания. Он нормализует внутренний порядок объединений типов, что означает, что различия между результатами компиляции с использованием устаревшего JavaScript-компилятора и будущего компилятора на основе Go действительно имеют смысл, а не являются следствием произвольной перестановки элементов. Включение этого флага сейчас и получение чистых результатов компиляции фактически представляет собой пробный запуск, позволяющий заранее проверить ваш кодовый базис перед переходом на TypeScript 7.

    Значимость этого для команд, работающих с полным стеком технологий

    • Отзывчивость редактора значительно улучшилась, поскольку сервис обработки языка теперь работает быстрее самого компилятора, с которым вы постоянно взаимодействуете в процессе ежедневной разработки.
    • Определения типов в Redux, React и Next.js становятся более строгими, поэтому с обновлением этих пакетов можно ожидать более строгих правил инференции в коде управления состоянием.
  • В настоящее время экосистема плагинов находится в нестабильном состоянии. Плагины-компиляторы, написанные для текущей версии TypeScript-компилятора, не будут совместимы с версией 7.0, поэтому если ваше программное обеспечение зависит от них, внимательно следите за их совместимостью.
  • Практические шаги миграции

    1. Начните обновление с отдельной разработческой ветки, а не непосредственно с основной линии кода.
    2. Запустите команду tsc --noEmit и классифицируйте возникающие ошибки в зависимости от частоты их появления в кодовой базе, а не от того, в каком файле они указаны первыми.
    3. Сначала решите проблему с параметром moduleResolution, поскольку именно он чаще всего приводит к неожиданным сбоям.
    4. Только после того, как всё остальное будет компилироваться без ошибок, включайте параметр stableTypeOrdering в качестве окончательной проверки на корректность миграции.

    TypeScript 6.0 не представляет собой набор впечатляющих новых функций. Он означает тщательную и осмотрительную оптимизацию, предшествующую самым значительным архитектурным изменениям в языке с момента его создания. Проводите эту миграцию попарно, пока у вас есть возможность контролировать процесс. Откладывание работы не устраняет её, а лишь переносит на более поздний момент, когда у вас будет меньше времени и больше давления для её правильного выполнения.

    Связанные статьи

  • Компилятор TypeScript на Go и нативная реализация: руководство по миграции — Узнайте, как компилятор TypeScript на основе Go и нативная реализация в Node.js повлияют на кодовые базы React и Next.js, и что необходимо исправить в вашем tsconfig прямо сейчас.
  • Отправка данных с RTK Query: практическое руководство по мутациям — Узнайте, как использовать метод builder.mutation() в RTK Query для отправки POST-запросов, управления состояниями загрузки и ошибок, а также для создания рабочего компонента формы.
  • Определение типов для React Hooks: useState, useEffect, useReducer и пользовательские хуки — Узнайте, как правильно задавать типы для useState, useEffect, useReducer и пользовательских хуков в TypeScript, а также когда использование TypeScript вместо обычного JavaScript действительно оправдано.