Статический анализ кода в ESLint опирается на промежуточное представление исходного текста — абстрактное синтаксическое дерево (AST). Парсер выполняет преобразование исходного JavaScript- или TypeScript-кода в структуру, пригодную для анализа правилами линтера. Без корректного парсера невозможна работа ни базовых синтаксических проверок, ни правил, использующих типизацию.
В стандартной конфигурации ESLint применяется парсер Espree, ориентированный на JavaScript. TypeScript расширяет синтаксис языка дополнительными конструкциями: типами, интерфейсами, перечислениями, generics и модификаторами доступа. Espree не способен корректно интерпретировать эти конструкции, что делает необходимым использование специализированного парсера.
Espree формирует AST на основе спецификации ECMAScript, однако TypeScript включает элементы, отсутствующие в стандарте Jav * aScript:
: string, : number)Array<T>)private, protected,
public)Попытка анализа TypeScript-кода стандартным парсером приводит к синтаксическим ошибкам или потере информации о типах. Это ограничивает возможности правил ESLint, особенно тех, которые зависят от семантики типов.
Основным решением для интеграции TypeScript в ESLint является
@typescript-eslint/parser. Этот парсер преобразует
TypeScript-код в ESTree-совместимый AST с расширениями, позволяющими
учитывать типовую систему языка.
Ключевые свойства:
Парсер не заменяет TypeScript-компилятор, а использует его внутренние механизмы для извлечения информации о типах и структуре кода.
Подключение парсера осуществляется через конфигурацию ESLint:
// eslint.config.js (Flat Config)
import tsParser from "@typescript-eslint/parser";
export default [
{
files: ["**/*.ts", "**/*.tsx"],
languageOptions: {
parser: tsParser,
parserOptions: {
ecmaVersion: "latest",
sourceType: "module"
}
}
}
];
В legacy-конфигурации:
module.exports = {
parser: "@typescript-eslint/parser",
parserOptions: {
ecmaVersion: 2022,
sourceType: "module"
}
};
Определяет версию ECMAScript, используемую при разборе. В контексте
TypeScript обычно устанавливается значение latest, что
позволяет поддерживать актуальный синтаксис JavaScript.
Задает режим модулей:
script — классический режимmodule — поддержка import/exportДля TypeScript-проектов практически всегда используется
module.
Ключевая опция для включения типо-зависимого анализа:
parserOptions: {
project: "./tsconfig.json"
}
При указании project парсер подключает TypeScript
Compiler API и формирует полноценную типовую модель проекта.
Используется для корректного разрешения относительных путей к
tsconfig.json:
parserOptions: {
project: "./tsconfig.json",
tsconfigRootDir: __dirname
}
Type-aware linting — режим анализа, при котором ESLint получает доступ к типам переменных, выражений и функций. Это позволяет создавать правила, учитывающие семантику TypeScript, а не только синтаксис.
Примеры возможностей:
Включение type-aware анализа требует обязательного указания
parserOptions.project.
@typescript-eslint/parser использует внутренние
механизмы TypeScript:
ts.createProgramts.getSourceFileРезультатом становится расширенный AST, который сохраняет совместимость с ESLint, но содержит дополнительные метаданные о типах.
TypeScript AST расширяет стандарт ESTree следующими элементами:
Эти узлы позволяют правилам ESLint различать синтаксические и семантические конструкции TypeScript.
Экосистема @typescript-eslint включает не только парсер,
но и набор правил и утилит:
@typescript-eslint/eslint-plugin — набор правил@typescript-eslint/parser — обработка ASTКонфигурация:
import tsParser from "@typescript-eslint/parser";
import tsPlugin from "@typescript-eslint/eslint-plugin";
export default [
{
files: ["**/*.ts"],
languageOptions: {
parser: tsParser,
parserOptions: {
project: "./tsconfig.json"
}
},
plugins: {
"@typescript-eslint": tsPlugin
},
rules: {
"@typescript-eslint/no-unused-vars": "error"
}
}
];
Type-aware режим существенно увеличивает нагрузку:
Факторы влияния:
files и
excludeДля оптимизации применяются:
parserOptions.projectService (новые
версии)overridesСовременные версии @typescript-eslint поддерживают
projectService, уменьшающий стоимость инициализации
TypeScript Program:
parserOptions: {
projectService: true
}
Механизм позволяет переиспользовать уже созданные сервисы анализа и снижать накладные расходы при linting больших кодовых баз.
В монорепозиториях возникает проблема множественных
tsconfig.json. Решения:
parserOptions: {
project: ["./packages/*/tsconfig.json"]
}
Каждый пакет может иметь собственный TypeScript Program, что снижает конфликтность зависимостей типов.
TypeScript-парсер поддерживает JSX через расширение
.tsx. Для корректной работы требуется:
parserOptions: {
ecmaFeatures: {
jsx: true
}
}
JSX-узлы преобразуются в совместимые конструкции ESTree с сохранением TypeScript-типизации компонентов.
При включении type-aware правил без project возникает
ошибка:
Несовместимость версий typescript и
@typescript-eslint/parser приводит к:
Неправильный tsconfigRootDir приводит к:
Парсер является фундаментом для выполнения правил:
Таким образом, качество парсинга напрямую определяет точность линтинга и полноту анализа кода в TypeScript-проектах