«npm WARN requires a peer»: как исправить и понять суть ошибки

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Введение: почему npm кричит на вас?

Вы когда-нибудь запускали npm install и видели что-то вроде этого?

npm WARN ts-patch@3.2.1 requires a peer of typescript@>=4.0 but none is installed. You must install peer dependencies yourself.

Знакомо? Если да — вы не одиноки. Этот вопрос на Stack Overflow собрал тысячи просмотров и десятки комментариев от разработчиков, которые, как и вы, хотели просто установить пакет, а получили головную боль. Сегодня мы разберёмся, что такое peer dependencies, почему npm так настойчиво требует их установить и как правильно с ними работать в проектах на TypeScript. И да, это будет не скучная документация, а живой разбор с примерами кода.

Поехали!

Что такое peer dependencies и зачем они нужны?

Представьте, что вы собираете пазл. У вас есть основная картинка (ваш проект) и несколько кусочков (пакеты). Некоторые кусочки идеально подходят друг к другу, но только если вы используете правильную рамку. В мире npm эта «рамка» — peer dependency.

Peer dependency (или «равноправная зависимость») — это требование пакета к тому, что определённая библиотека должна быть установлена в проекте, но сам пакет не будет её устанавливать. Почему? Потому что эта библиотека уже должна быть у вас, и пакет просто «дружит» с ней, не создавая дубликатов.

Например, пакет ts-patch (популярный инструмент для TypeScript) требует, чтобы в проекте был установлен typescript. Но ts-patch не устанавливает TypeScript сам — он предполагает, что вы уже его добавили. Если TypeScript нет, npm выдаёт то самое предупреждение.

Почему это важно для TypeScript-проектов?

TypeScript — это не просто язык, это экосистема. Многие пакеты (например, @types/react, ts-loader, eslint-plugin-typescript) работают поверх TypeScript. Если у вас установлена версия TypeScript 5.0, а пакет требует 4.0+, всё хорошо. Но если TypeScript вообще нет — начинаются проблемы.

Вот реальный пример из жизни. Допустим, вы пишете небольшой скрипт на TypeScript и используете ts-patch для трансформации кода. Вы запускаете:

npm install ts-patch --save-dev

И получаете:

npm WARN ts-patch@3.2.1 requires a peer of typescript@>=4.0 but none is installed.
You must install peer dependencies yourself.

Что делать? Паниковать? Нет. Просто установите TypeScript:

npm install typescript --save-dev

Проблема решена. Но что если у вас уже есть TypeScript, но другой версии? Тут начинается самое интересное.

Сравнение подходов: как устанавливать peer dependencies

Существует несколько способов справиться с этой ошибкой. Давайте сравним их на примере TypeScript-проекта.

Подход 1: Ручная установка (классика)

Самый простой и надёжный способ — прочитать предупреждение и вручную установить нужный пакет. Вы видите, что требуется typescript@>=4.0, и добавляете его:

npm install typescript@^4.0 --save-dev

Плюсы:

  • Полный контроль над версией.
  • Нет скрытых сюрпризов.

Минусы:

  • Нужно внимательно читать сообщения npm.
  • Если пакетов много, процесс становится рутинным.

Этот подход идеален для небольших проектов, где вы точно знаете, какие зависимости вам нужны.

Подход 2: Автоматическая установка с помощью npx или плагинов

Некоторые инструменты, например npm-check или install-peerdeps, могут автоматически установить все peer dependencies для конкретного пакета. Установите утилиту глобально:

npm install -g install-peerdeps

А затем запустите для нужного пакета:

install-peerdeps ts-patch

Утилита сама найдёт все peer dependencies и установит их в правильных версиях.

Плюсы:

  • Экономит время.
  • Подходит для сложных проектов с кучей зависимостей.

Минусы:

  • Дополнительный инструмент, который нужно устанавливать.
  • Может установить версию, которая не совпадает с вашими требованиями (например, если вы используете TypeScript 5.0, а он предложит 4.0).

Подход 3: Использование npm@7+ (автоматическая установка)

Начиная с npm версии 7, peer dependencies устанавливаются автоматически. Если вы обновите npm до актуальной версии, вы можете вообще забыть об этой ошибке. Проверьте свою версию:

npm --version

Если версия 7 или выше, просто удалите node_modules и package-lock.json, а затем выполните чистую установку:

rm -rf node_modules package-lock.json
npm install

npm сам подтянет все необходимые peer dependencies.

Плюсы:

  • Не нужно ничего делать вручную.
  • Работает «из коробки».

Минусы:

  • Может привести к конфликтам версий, если у вас уже установлены несовместимые пакеты.
  • Не все проекты готовы к обновлению npm (например, если используется старый CI/CD).

Пример из реального проекта на TypeScript

Допустим, вы разрабатываете библиотеку для работы с API на TypeScript. Вы решили использовать ts-patch для генерации типов из схем. Вот как выглядит ваш package.json до установки:

{
  "name": "my-api-lib",
  "version": "1.0.0",
  "devDependencies": {
    "ts-patch": "^3.2.0"
  }
}

Запускаем npm install и видим:

npm WARN ts-patch@3.2.1 requires a peer of typescript@>=4.0 but none is installed.
You must install peer dependencies yourself.

Теперь применяем подход 1 — ручную установку. Добавляем TypeScript:

npm install typescript@^4.0 --save-dev

После этого package.json выглядит так:

{
  "name": "my-api-lib",
  "version": "1.0.0",
  "devDependencies": {
    "ts-patch": "^3.2.0",
    "                

Блоги

Рекомендаций по книгам