В TypeScript-проектах ESLint выступает не только как инструмент
проверки качества кода, но и как механизм контроля типовой корректности
при использовании @typescript-eslint. Типичная конфигурация
строится вокруг связки базового ESLint, TypeScript-парсера и набора
рекомендуемых правил.
Основной пакет для работы с TypeScript:
typescripteslint@typescript-eslint/parser@typescript-eslint/eslint-pluginСтруктура конфигурации чаще всего начинается с определения парсера:
module.exports = {
parser: '@typescript-eslint/parser',
parserOptions: {
ecmaVersion: 2022,
sourceType: 'module',
project: './tsconfig.json'
}
};
Ключевой момент — параметр project. Он включает
type-aware linting, позволяя ESLint анализировать типы, а не только
синтаксис.
Типичный базовый набор включает две группы правил: ESLint core и TypeScript-specific.
module.exports = {
extends: [
'eslint:recommended',
'plugin:@typescript-eslint/recommended'
]
};
Более строгий режим:
extends: [
'eslint:recommended',
'plugin:@typescript-eslint/recommended-type-checked',
'plugin:@typescript-eslint/stylistic-type-checked'
]
Использование type-checked конфигураций увеличивает время анализа, но даёт более точные проверки, включая:
anyСтандартная организация конфигурации:
project/
├─ src/
├─ tsconfig.json
├─ eslint.config.js (или .eslintrc.js)
├─ package.json
В зависимости от версии ESLint используется либо классическая
конфигурация (.eslintrc), либо flat config
(eslint.config.js).
Настройка правил требует баланса между строгостью и практичностью. Типовой набор:
rules: {
'@typescript-eslint/no-unused-vars': 'error',
'@typescript-eslint/no-explicit-any': 'warn',
'@typescript-eslint/explicit-function-return-type': 'off',
'@typescript-eslint/no-non-null-assertion': 'warn'
}
Каждое правило регулирует отдельный аспект:
no-unused-vars — контроль неиспользуемых
переменныхno-explicit-any — ограничение на использование
anyexplicit-function-return-type — контроль явных типов
возвращаемых значенийno-non-null-assertion — ограничение оператора
!Type-aware linting требует подключения TypeScript конфигурации. Это влияет на производительность и возможности анализа.
parserOptions: {
project: ['./tsconfig.json'],
tsconfigRootDir: __dirname
}
При использовании монорепозиториев:
parserOptions: {
project: ['./packages/*/tsconfig.json']
}
Важно учитывать, что ESLint начинает выполнять TypeScript program building, что увеличивает нагрузку на процесс линтинга.
Плагин предоставляет набор расширенных правил, недоступных в базовом ESLint:
Пример подключения:
plugins: ['@typescript-eslint']
Расширенные правила:
rules: {
'@typescript-eslint/restrict-template-expressions': 'error',
'@typescript-eslint/consistent-type-imports': 'error',
'@typescript-eslint/no-misused-promises': 'error'
}
Для контроля импортов используется eslint-plugin-import,
который требует дополнительной настройки резолвинга TypeScript:
settings: {
'import/resolver': {
typescript: {}
}
}
Типичные правила:
rules: {
'import/no-unresolved': 'off',
'import/order': ['error', {
alphabetize: { order: 'asc' },
'newlines-between': 'always'
}]
}
TypeScript сам управляет резолвингом, поэтому некоторые правила ESLint необходимо отключать.
Современный формат конфигурации строится вокруг массива объектов:
import tseslint from '@typescript-eslint/eslint-plugin';
import tsparser from '@typescript-eslint/parser';
export default [
{
files: ['**/*.ts'],
languageOptions: {
parser: tsparser,
parserOptions: {
project: './tsconfig.json'
}
},
plugins: {
'@typescript-eslint': tseslint
},
rules: {
'@typescript-eslint/no-explicit-any': 'warn'
}
}
];
Особенность flat config — отсутствие наследования
extends в классическом виде, конфигурация становится более
явной и композиционной.
Для оптимизации анализа используются .eslintignore или
ignores в flat config.
node_modules
dist
build
coverage
В flat config:
{
ignores: ['dist/**', 'node_modules/**']
}
Ускорение достигается за счёт исключения:
.d.ts (в некоторых случаях)В проектах с React добавляется eslint-plugin-react и
eslint-plugin-react-hooks.
extends: [
'plugin:react/recommended',
'plugin:react-hooks/recommended',
'plugin:@typescript-eslint/recommended'
]
Ключевые настройки:
settings: {
react: {
version: 'detect'
}
}
Правила:
rules: {
'react/react-in-jsx-scope': 'off',
'react-hooks/rules-of-hooks': 'error'
}
TypeScript требует отключения некоторых устаревших React-правил.
Для backend-проектов добавляется eslint-plugin-n:
extends: [
'plugin:@typescript-eslint/recommended',
'plugin:n/recommended'
]
Правила:
rules: {
'n/no-missing-import': 'off',
'n/no-unsupported-features/es-syntax': 'off'
}
Причина отключения — использование TypeScript, который транспилирует современный синтаксис.
В монорепозиториях ESLint конфигурация становится многоуровневой:
packages/
app/
shared/
ui/
eslint.config.js
Подходы:
Пример overrides:
overrides: [
{
files: ['packages/ui/**/*.ts'],
rules: {
'@typescript-eslint/no-explicit-any': 'off'
}
}
]
ESLint и Prettier часто используются совместно, при этом конфликты
правил устраняются через eslint-config-prettier.
extends: [
'plugin:@typescript-eslint/recommended',
'prettier'
]
ESLint отвечает за качество кода, Prettier — за форматирование.
Отключаемые правила форматирования:
В TypeScript-проектах часто встречаются следующие проблемы:
parserOptions.project, из-за чего type-aware
правила не работают@typescript-eslintany без контроляДля сложных проектов применяется разделение логики:
Пример:
module.exports = {
extends: [
'./eslint.base.js',
'./eslint.node.js'
]
};
Тестовые окружения (Jest/Vitest):
overrides: [
{
files: ['**/*.test.ts'],
env: {
jest: true
},
rules: {
'@typescript-eslint/no-explicit-any': 'off'
}
}
]
Такой подход позволяет управлять строгими правилами в зависимости от контекста исполнения кода.