Поддержка TypeScript в ESLint реализуется не на уровне ядра, а через
экосистему специализированных пакетов, главным из которых является
@typescript-eslint. Он расширяет базовую модель линтинга,
добавляя понимание типов, синтаксиса и семантики TypeScript.
Ключевая идея интеграции заключается в том, что стандартный парсер ESLint не способен корректно анализировать TypeScript-код. Поэтому используется отдельный парсер, а поверх него — набор правил, учитывающих типовую систему.
Основой работы является @typescript-eslint/parser. Он
заменяет стандартный парсер ESLint и преобразует TypeScript-код в AST,
совместимый с ESLint.
Пример конфигурации:
parser: '@typescript-eslint/parser',
parserOptions: {
ecmaVersion: 2022,
sourceType: 'module',
project: './tsconfig.json'
}
Параметр project включает типо-зависимый анализ. Это
важный режим, так как многие правила @typescript-eslint
требуют доступа к TypeScript Compiler API.
Типовая структура конфигурации включает:
extends: [
'eslint:recommended',
'plugin:@typescript-eslint/recommended'
],
plugins: ['@typescript-eslint']
Набор recommended активирует правила, ориентированные на
безопасность типов и предотвращение распространённых ошибок.
Правила делятся на несколько логических групп.
Эта группа ориентирована на строгую типизацию и устранение слабых мест системы типов.
Запрещает использование any, которое разрушает типовую
безопасность.
Пример проблемного кода:
function parse(data: any) {
return data.value;
}
Альтернатива — использование unknown или дженериков.
Удаляет избыточные аннотации типов, которые TypeScript способен вывести сам:
const count: number = 5;
Правильнее:
const count = 5;
Требует явного указания возвращаемого типа функции:
function sum(a: number, b: number): number {
return a + b;
}
Это повышает предсказуемость API и предотвращает неявные изменения сигнатур.
TypeScript вводит дополнительные уровни импортов, которые требуют специальной обработки.
Разделяет импорт типов и значений:
import type { User } from './types';
import { createUser } from './service';
Преимущества:
Расширенная версия базового правила, учитывающая типовые импорты.
TypeScript активно использует структурную типизацию, поэтому контроль за определениями типов критичен.
Запрещает пустые интерфейсы:
interface User {}
Такие конструкции не несут смысла и часто указывают на архитектурную ошибку.
Ранее использовались префиксы IUser, но современные
конфигурации часто запрещают их для унификации:
interface IUser {} // нежелательно
interface User {} // предпочтительно
Контролирует стиль разделителей в интерфейсах и типах:
interface User {
id: number;
name: string;
}
Поддерживаются строгие кодстайл-политики для единообразия.
TypeScript расширяет классы за счёт модификаторов доступа и абстракций.
Контролирует стиль приведения типов:
const value = response as User;
или
const value = <User>response;
В современных конфигурациях предпочтителен as.
Требует явного указания модификаторов:
class Service {
public name: string;
private cache: Map<string, string>;
}
Это улучшает читаемость и архитектурную прозрачность.
Эта категория ориентирована на предотвращение скрытых ошибок.
Запрещает использование опасных или неоднозначных типов:
ObjectFunction{} (в некоторых конфигурациях)Пример:
let value: Object; // нежелательно
Рекомендуется использовать более точные типы.
Запрещает присваивание значений с неявно небезопасным типом:
const value: string = getValue(); // если getValue(): any
Контролирует вызовы функций с потенциально неизвестной сигнатурой.
TypeScript активно использует обобщения, что требует дополнительного контроля.
Запрещает избыточные ограничения:
function identity<T extends string>(arg: T): T {
return arg;
}
Если ограничение не добавляет смысла, оно удаляется.
Рекомендует использование readonly для неизменяемых
структур:
interface Config {
readonly port: number;
}
Требует явного описания типов параметров и возвращаемых значений в определённых контекстах.
const add = (a: number, b: number): number => a + b;
Контролирует неправильное использование Promise в
синхронных контекстах:
if (asyncFunction()) {
// ошибка логики
}
Type-aware правила требуют подключения tsconfig.json,
что влияет на производительность.
Ключевые особенности:
Для крупных проектов применяются оптимизации:
parserOptions.projectoverridesТиповая архитектура конфигурации включает несколько уровней:
Пример:
overrides: [
{
files: ['*.test.ts'],
rules: {
'@typescript-eslint/no-explicit-any': 'off'
}
}
]
Переход к TypeScript-правилам меняет модель анализа кода:
Это приводит к более строгой, но более предсказуемой кодовой базе, где многие ошибки выявляются до выполнения программы.