Пакет @typescript-eslint/eslint-plugin представляет собой набор правил ESLint, разработанных специально для анализа кода на TypeScript. Его роль заключается в расширении стандартного набора ESLint-правил возможностями, учитывающими типы, синтаксис и особенности системы типов TypeScript.
ESLint по своей природе работает с ESTree-совместимым AST, однако
TypeScript вводит собственные синтаксические конструкции (интерфейсы,
перечисления, модификаторы доступа, generics, union/intersection типы),
которые требуют отдельного разбора и специализированной логики анализа.
Плагин выступает связующим звеном между ESLint и TypeScript-компилятором
через использование @typescript-eslint/parser.
Корректная работа плагина требует установки нескольких взаимосвязанных пакетов:
eslinttypescript@typescript-eslint/parser@typescript-eslint/eslint-pluginТипичная установка в проекте:
npm install -D eslint typescript @typescript-eslint/parser @typescript-eslint/eslint-plugin
Базовая конфигурация ESLint:
module.exports = {
parser: '@typescript-eslint/parser',
parserOptions: {
ecmaVersion: 2022,
sourceType: 'module',
project: './tsconfig.json',
},
plugins: ['@typescript-eslint'],
extends: [
'eslint:recommended',
'plugin:@typescript-eslint/recommended',
],
};
Ключевой момент — параметр project. Его наличие включает
type-aware linting, при котором правила получают доступ
к информации TypeScript Compiler API. Это существенно расширяет
возможности анализа, но увеличивает время проверки.
Плагин не функционирует автономно. Он зависит от парсера
@typescript-eslint/parser, который преобразует
TypeScript-код в AST, совместимый с ESLint.
Основные задачи парсера:
project)Без корректного парсера правила плагина либо не работают, либо работают в ограниченном режиме.
Плагин содержит набор правил, разделённых по категориям:
Каждое правило реализовано как модуль, использующий ESLint Rule API, но дополненный доступом к TypeScript TypeChecker.
Эти правила направлены на выявление потенциальных багов:
no-floating-promisesno-misused-promisesno-unsafe-assignmentno-unsafe-member-accessno-unsafe-callОсобенность этих правил заключается в использовании анализа типов.
Например, no-floating-promises отслеживает промисы, которые
не обрабатываются через await или .catch.
Данный класс правил требует включённого
parserOptions.project.
Пример:
await-thenablerestrict-template-expressionsno-unnecessary-type-assertionstrict-boolean-expressionsПринцип работы основан на взаимодействии с TypeScript TypeChecker:
Часть правил заменяет или дополняет ESLint core:
no-extra-parens (TypeScript-aware версия)consistent-type-importsexplicit-function-return-typemember-delimiter-styleЭти правила часто используются для унификации кодовой базы и повышения читаемости TypeScript-кода.
Некоторые стандартные правила ESLint конфликтуют с TypeScript или не понимают его синтаксис. Плагин предоставляет аналоги:
| ESLint core | TypeScript ESLint |
|---|---|
| no-shadow | @typescript-eslint/no-shadow |
| no-unused-vars | @typescript-eslint/no-unused-vars |
| no-use-before-define | @typescript-eslint/no-use-before-define |
Замена обусловлена тем, что TypeScript вводит дополнительные сущности (типы, интерфейсы), которые ESLint core не учитывает.
Включение parserOptions.project переводит ESLint в
режим, при котором он анализирует проект через TypeScript Program
API.
parserOptions: {
project: './tsconfig.json',
}
Это приводит к следующим эффектам:
Особенно важно наличие корректного tsconfig.json, так
как ошибки конфигурации могут приводить к деградации производительности
или некорректным результатам.
Плагин предоставляет готовые наборы конфигураций.
extends: [
'plugin:@typescript-eslint/recommended'
]
Включает базовый набор правил, предотвращающих очевидные ошибки и обеспечивающих совместимость с TypeScript.
extends: [
'plugin:@typescript-eslint/recommended-type-checked',
'plugin:@typescript-eslint/strict'
]
Активирует более строгий режим анализа, включающий:
Type-aware правила значительно увеличивают нагрузку на систему.
Факторы влияния:
Типичные методы оптимизации:
parserOptions.projectService (в новых
версиях)Отслеживает неиспользуемые переменные с учётом типов и импортов.
Особенности:
Формирует единый стиль импорта типов:
import type { User } from './types';
Цель — разгрузка runtime-кода и улучшение tree-shaking.
Выявляет ситуации, где Promise используется как boolean или напрямую передаётся в синхронный контекст:
if (getData()) { }
Правильная форма требует явного await или обработки результата.
В монорепозиториях с несколькими tsconfig.json требуется
отдельная настройка:
parserOptions: {
project: [
'./packages/*/tsconfig.json'
],
}
Проблематика:
Часто применяется стратегия изолированных проектов с отдельными ESLint конфигурациями.
В новых версиях ESLint используется flat config:
export default [
{
languageOptions: {
parser: tsParser,
},
plugins: {
'@typescript-eslint': tsPlugin,
},
}
];
Плагин поддерживает flat config, однако некоторые legacy-конфигурации требуют адаптации правил и extends.
Типичные проблемы:
Приводит к отключению type-aware правил или ошибке:
Если ESLint запускается вне контекста TypeScript проекта:
Использование одновременно babel-eslint и
@typescript-eslint/parser приводит к некорректной работе
AST.
Плагин включает правила, упрощающие переход:
varПример:
function add(a, b) {
return a + b;
}
При строгой конфигурации требуется:
function add(a: number, b: number): number {
return a + b;
}
@typescript-eslint/eslint-plugin выполняет функцию статического слоя контроля поверх TypeScript-компилятора.
TypeScript обеспечивает:
ESLint с плагином обеспечивает:
Разделение ответственности позволяет строить многоуровневую систему качества кода, где компилятор и линтер решают разные задачи, но работают совместно через единый AST и type system.