Ошибка "parserOptions.project has been set for @typescript-eslint/parser" — как исправить?
Проблема: несоответствие между настройками 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), так что это не должно быть проблемой.
Пошаговое исправление
- Убедитесь, что ESLint запускается из корня проекта — там же, где лежит tsconfig.json.
- Проверьте tsconfig.json — укажите явно маску:
"include": ["src/**/*.ts"]. - Добавьте 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.