Aller au contenu

ESLint : TypeScript

ESLint ne comprend pas TypeScript seul : le projet typescript-eslint fournit l’analyseur et des règles dédiées.

Fenêtre de terminal
npm install -D eslint @eslint/js typescript typescript-eslint

eslint.config.js :

import js from '@eslint/js';
import tseslint from 'typescript-eslint';
export default tseslint.config(
{ ignores: ['dist/', 'coverage/'] },
js.configs.recommended,
...tseslint.configs.recommended,
{
files: ['**/*.{ts,tsx}'],
rules: {
'@typescript-eslint/no-unused-vars': [
'error',
{ argsIgnorePattern: '^_' },
],
'@typescript-eslint/consistent-type-imports': 'error',
},
},
);

tseslint.config(...) assemble les blocs et vérifie leur forme ; avec les versions récentes d’ESLint, defineConfig (de eslint/config) joue le même rôle. Le paquet typescript-eslint regroupe l’analyseur et le plugin.

Jeu Contenu
recommended Erreurs probables, sans informations de types (point de départ)
strict Règles supplémentaires plus exigeantes
stylistic Cohérence de style (types, interfaces)
recommendedTypeChecked, strictTypeChecked, stylisticTypeChecked Variantes avec informations de types (plus puissantes, plus lentes)

Certaines règles utilisent le vérificateur de types de TypeScript pour détecter des erreurs que l’analyse seule ne voit pas :

Règle Détecte
no-floating-promises Promesse non attendue ni capturée
no-misused-promises Promesse passée là où on attend une valeur (condition, rappel)
await-thenable await sur une valeur qui n’est pas une promesse
no-unsafe-assignment, no-unsafe-member-access, no-unsafe-call Usage de valeurs de type any
restrict-template-expressions Valeur inattendue dans un gabarit de chaîne
no-unnecessary-condition Condition toujours vraie ou fausse d’après les types

Activation :

import js from '@eslint/js';
import tseslint from 'typescript-eslint';
export default tseslint.config(
{ ignores: ['dist/', 'coverage/'] },
js.configs.recommended,
...tseslint.configs.recommendedTypeChecked,
{
languageOptions: {
parserOptions: {
projectService: true, // utilise tsconfig.json automatiquement
tsconfigRootDir: import.meta.dirname,
},
},
},
{
// fichiers hors tsconfig (configuration, scripts) : sans informations de types
files: ['**/*.js', '**/*.mjs', 'eslint.config.js'],
...tseslint.configs.disableTypeChecked,
},
);

projectService: true lit le tsconfig.json du projet (option des versions récentes ; l’ancienne option est project: ['./tsconfig.json']). Les fichiers qui ne font pas partie du tsconfig.json provoquent l’erreur « not found by the project service » : les exclure du bloc, ou les ajouter à include.

Le coût : l’analyse avec types est plus lente (elle charge tout le programme TypeScript). Réserver ces règles aux fichiers de src/ et utiliser --cache.

rules: {
'@typescript-eslint/no-explicit-any': 'warn',
'@typescript-eslint/no-non-null-assertion': 'warn',
'@typescript-eslint/consistent-type-imports': ['error', { prefer: 'type-imports' }],
'@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }],
'@typescript-eslint/explicit-function-return-type': 'off',
'@typescript-eslint/no-floating-promises': 'error',
}

Désactiver la règle ESLint de base quand la version TypeScript existe : no-unused-vars → @typescript-eslint/no-unused-vars (les jeux recommended s’en chargent).

tsc ESLint
Vérifie les types Oui Non (utilise les types pour certaines règles)
Détecte les mauvaises pratiques Peu Oui
Vitesse Rapide Plus lent avec types

Lancer les deux : tsc --noEmit pour les types, ESLint pour la qualité ; dans l’intégration continue, séparer les étapes (voir Intégration continue et performance).

La configuration TypeScript se combine avec les plugins dédiés : voir React, Astro et Next.js. Avec Vitest, les fichiers de test peuvent avoir des règles assouplies :

{
files: ['**/*.test.ts'],
rules: {
'@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/no-non-null-assertion': 'off',
},
}

eslint.config.ts est possible avec les versions récentes d’ESLint et le paquet jiti (npm install -D jiti) : la configuration est alors typée. Garder eslint.config.js tant que ce n’est pas nécessaire.

Symptôme Piste
Parsing error: Unexpected token : Analyseur TypeScript absent : utiliser tseslint.configs.*
Parsing error: "parserOptions.project" has been provided … file was not found in the project Fichier hors de tsconfig.json : l’ajouter à include, ou le traiter avec disableTypeChecked
Error: You have used a rule which requires type information projectService/project non défini
Cannot find module 'typescript-eslint' npm install -D typescript-eslint
Analyse très lente Règles avec types sur trop de fichiers, absence de --cache
@typescript-eslint/no-unused-vars signale des types Utilisés seulement comme types : import type, ou règle configurée
Conflit entre no-unused-vars et la version TypeScript Désactiver la règle de base (les jeux le font)
Version de TypeScript non prise en charge (avertissement) Mettre à jour typescript-eslint

Ubuntu 24.04 et 26.04 : différences à connaître

Section intitulée « Ubuntu 24.04 et 26.04 : différences à connaître »

Aucune.