В контексте статического анализа TypeScript-кода ключевым механизмом
становится подключение проекта компилятора TypeScript к процессу
линтинга. В ESLint это реализуется через параметр
parserOptions.project, который используется парсером
@typescript-eslint/parser для включения type-aware
правил.
ESLint в базовой конфигурации работает с синтаксическим деревом
(AST), не имея доступа к типам. Подключение
parserOptions.project меняет модель анализа: линтер
начинает использовать TypeScript Program, что позволяет выполнять
правила, зависящие от системы типов, импорта модулей и контекста
компиляции.
parserOptions.project в архитектуре анализаБез указания project ESLint анализирует файлы в
изоляции. В этом режиме доступны только синтаксические правила:
форматирование, базовые проверки, потенциально опасные конструкции.
При включении:
parserOptions: {
project: "./tsconfig.json"
}
инициализируется TypeScript Program, который:
tsconfig.jsonЭто позволяет правилам анализировать не только структуру кода, но и его смысл.
Типичная настройка включает:
import tsParser from "@typescript-eslint/parser";
export default {
parser: tsParser,
parserOptions: {
project: "./tsconfig.json",
tsconfigRootDir: __dirname,
sourceType: "module"
}
};
Ключевые параметры:
tsconfig.json или
массив путейmodule или
script)При активации project происходит:
tsconfig.jsoninclude,
exclude)Это критически важно: без Program невозможны правила, использующие:
no-floating-promisesno-misused-promisesstrict-boolean-expressionsВ монорепозиториях часто используется несколько tsconfig:
parserOptions: {
project: [
"./packages/app/tsconfig.json",
"./packages/shared/tsconfig.json"
]
}
Такой режим приводит к созданию нескольких Program’ов, что увеличивает нагрузку на память и время анализа.
Особенности:
Использование parserOptions.project существенно влияет
на производительность:
Без project:
С project:
Основная причина замедления — повторное создание TypeChecker и анализ зависимостей.
В современных версиях @typescript-eslint/parser
используется кеширование Program:
Однако кеш эффективен только при стабильной структуре проекта.
Факторы, ухудшающие кеширование:
parserOptions: {
project: "./tsconfig.json",
tsconfigRootDir: process.cwd()
}
Если ESLint запускается не из корня проекта, tsconfig может не находиться, что приводит к падению анализа.
Если в проекте нет type-aware правил, подключение
project только замедляет процесс без пользы.
{
"include": ["src"],
"exclude": ["node_modules"]
}
Если ESLint анализирует файлы вне include, TypeScript
Program их не распознаёт.
Возникает, когда:
В новой конфигурации ESLint (flat config) настройка сохраняется:
export default [
{
files: ["**/*.ts"],
languageOptions: {
parser: tsParser,
parserOptions: {
project: "./tsconfig.json"
}
}
}
];
Особенность flat config:
Современные версии @typescript-eslint поддерживают
projectService:
Принцип:
projecttsconfig.lib.jsondeclaration: true)Наличие parserOptions.project открывает доступ к
правилам, которые:
Примеры категорий:
Для снижения нагрузки применяются:
files в конфигурацииTypeScript Program пересобирается при:
ESLint старается минимизировать пересоздание, но при крупных изменениях пересчёт неизбежен.
Типовые признаки неправильной настройки:
Анализ обычно начинается с: