Avatar ·

Ошибка "parserOptions.project has been set for @typescript-eslint/parser" — как исправить?

Привет! Я новичок в TypeScript и пытаюсь настроить ESLint в своём проекте. Использую @typescript-eslint/parser и @typescript-eslint/eslint-plugin. Но при запуске ESLint получаю странную ошибку: ``` Parsing error: "parserOptions.project" has been set for @typescript-eslint/parser. The file does not match your project config: src/index.ts. The file must be included in at least one of the projects provided. ``` Вот мой .eslintrc.json: ```json { "parser": "@typescript-eslint/parser", "parserOptions": { "project": "./tsconfig.json" }, "plugins": ["@typescript-eslint"], "extends": [ "eslint:recommended", "plugin:@typescript-eslint/recommended" ] } ``` И tsconfig.json: ```json { "compilerOptions": { "target": "ES2020", "module": "commonjs", "strict": true, "esModuleInterop": true, "outDir": "./dist" }, "include": ["src/**/*"], "exclude": ["node_modules"] } ``` Файл src/index.ts существует и содержит простой код. Я проверил — путь правильный, файл не пустой. Почему ESLint говорит, что файл не соответствует проекту? Как это исправить? Может, я что-то не так настроил? Буду благодарен за подробное объяснение, так как в документации не очень понятно написано. <<>>

Проблема: несоответствие между настройками ESLint и TypeScript

Ошибка возникает из-за того, что @typescript-eslint/parser использует TypeScript API для анализа типов, и ему нужно знать, к какому проекту (tsconfig.json) относится проверяемый файл. Когда вы указываете "project": "./tsconfig.json", парсер пытается загрузить этот конфиг и проверить, входит ли текущий файл в список include или files этого tsconfig.

Самая частая причина — ESLint запускается из другой директории или путь в parserOptions.project указан неверно. Но в вашем случае, судя по ошибке, файл src/index.ts существует и tsconfig его включает. Значит, проблема в другом.

Основные причины и решения

1. Неправильный относительный путь в parserOptions.project

Путь "./tsconfig.json" вычисляется относительно текущей рабочей директории, где запускается ESLint, а не относительно расположения .eslintrc.json. Если вы запускаете ESLint из корня проекта — всё должно работать. Но если вы запускаете его из подпапки (например, cd src && eslint index.ts), то путь ./tsconfig.json будет указывать на src/tsconfig.json, которого не существует.

Решение: используйте абсолютный путь или путь относительно корня:

// .eslintrc.json
{
  "parser": "@typescript-eslint/parser",
  "parserOptions": {
    "project": "${workspaceFolder}/tsconfig.json"  // для VS Code
    // или просто "tsconfig.json" если запускаете из корня
  }
}

2. tsconfig.json не включает проверяемый файл

Проверьте, что ваш файл src/index.ts действительно попадает под маску "include": ["src/**/*"]. Иногда бывает опечатка — например, "src/**" без /* или "src/**/*.ts" (без звёздочки). Убедитесь, что файл физически находится в src/.

3. Наличие нескольких tsconfig.json в проекте

Если у вас есть вложенные tsconfig файлы (например, src/tsconfig.json), парсер может запутаться. Лучше указать явно:

"parserOptions": {
  "project": ["./tsconfig.json"]  // массив из одного элемента
}

4. Использование extends с type-aware правилами

Некоторые правила из plugin:@typescript-eslint/recommended-requiring-type-checking требуют parserOptions.project. Если вы используете их, убедитесь, что проект настроен правильно. В вашем случае вы используете recommended (без type-checking), так что это не должно быть проблемой.

Пошаговое исправление

  1. Убедитесь, что ESLint запускается из корня проекта — там же, где лежит tsconfig.json.
  2. Проверьте tsconfig.json — укажите явно маску: "include": ["src/**/*.ts"].
  3. Добавьте tsconfig.json в parserOptions.project как массив:
// .eslintrc.json (исправленный)
{
  "parser": "@typescript-eslint/parser",
  "parserOptions": {
    "project": ["./tsconfig.json"],  // обязательно массив
    "tsconfigRootDir": "./"          // явно укажите корень
  },
  "plugins": ["@typescript-eslint"],
  "extends": [
    "eslint:recommended",
    "plugin:@typescript-eslint/recommended"
  ],
  "ignorePatterns": ["dist/", "node_modules/"]
}

Альтернатива: отказ от type-aware режима

Если вам не нужны правила, требующие проверки типов (например, @typescript-eslint/no-floating-promises), вы можете просто убрать parserOptions.project и использовать только синтаксический анализ:

{
  "parser": "@typescript-eslint/parser",
  "parserOptions": {
    "ecmaVersion": 2020,
    "sourceType": "module"
  },
  "plugins": ["@typescript-eslint"],
  "extends": [
    "eslint:recommended",
    "plugin:@typescript-eslint/recommended"
  ]
}

Это решит ошибку, но вы потеряете некоторые продвинутые правила, работающие с типами.

Что делать, если ничего не помогло?

  • Проверьте, нет ли в проекте .eslintignore — он может исключать ваши файлы.
  • Убедитесь, что версии пакетов совместимы: @typescript-eslint/parser и @typescript-eslint/eslint-plugin должны быть одной версии (например, 5.x или 6.x).
  • Попробуйте запустить ESLint с флагом --debug — он покажет, какие файлы и tsconfig загружаются.

В большинстве случаев проблема решается явным указанием tsconfigRootDir и использованием массива для project.

<<>>

Использование ESLint с TypeScript через плагин для редактора

Если вы используете VS Code (или другой редактор с интеграцией ESLint), проблема может быть в том, что ESLint сервер запускается не из корня проекта. Редактор может запускать ESLint из открытой папки, а не из корня проекта.

Решение: создайте в корне проекта файл .vscode/settings.json и укажите:

{
  "eslint.workingDirectories": [
    { "mode": "auto" }
  ]
}

Это заставит ESLint автоматически определять корневую директорию для каждого открытого файла.

Другой подход: отказ от проекта в пользу глобального tsconfig

Если у вас монорепозиторий или несколько tsconfig файлов, можно создать отдельный tsconfig для ESLint:

// tsconfig.eslint.json
{
  "extends": "./tsconfig.json",
  "include": ["src/**/*.ts", "tests/**/*.ts", ".eslintrc.js"]
}

Затем в .eslintrc.json укажите:

"parserOptions": {
  "project": ["./tsconfig.eslint.json"]
}

Это гарантирует, что все файлы, которые проверяет ESLint (включая конфиги), будут включены в проект.

Использование плагина eslint-import-resolver-typescript

Если ошибка возникает при импортах (например, Cannot find module), установите:

npm install --save-dev eslint-import-resolver-typescript

И добавьте в .eslintrc.json:

"settings": {
  "import/resolver": {
    "typescript": {
      "project": "./tsconfig.json"
    }
  }
}

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