node.js - Kan ikke linting av mitt TypeScript-prosjekt ved bruk av @typescript-eslint/eslint-plugin og eslint.config.js flat konfigurasjon
Jeg ønsker å migrere fra .eslintrc.json til eslint.config.js før konfigurasjonen blir avviklet i ESLint v9.0.0. Jeg gikk gjennom grunnene bak endringen, som jeg fant godt begrunnet.
Her er min nye eslint.config.js med noen grunnleggende innstillinger:
const typeScriptEslintParser = require('@typescript-eslint/parser');
const typeScriptEsLintPlugin = require('@typescript-eslint/eslint-plugin');
const esLintConfigPrettier = require('eslint-config-prettier');
module.exports = [
"eslint:recommended",
typeScriptEsLintPlugin.configs.recommended,
esLintConfigPrettier,
{
languageOptions: {
parser: typeScriptEslintParser,
parserOptions: {
ecmaVersion: 'latest',
sourceType: 'module',
},
},
plugins: {
'@typescript-eslint': typeScriptEsLintPlugin,
},
rules: {
'@typescript-eslint/no-unused-vars': 'error',
},
},
];
Filen .eslintrc.json utvider normalt fra eslint:recommended og plugin:@typescript-eslint/recommended. Når jeg prøver å legge til konfigurasjonen eksportert av @typescript-eslint/recommended til eslint.config.js, får jeg følgende feil:
ESLint: Error: Key "extends": This appears to be in eslintrc format rather than flat config format.
Til slutt, når det gjelder IDE-støtte, ser WebStorm automatisk etter .eslintrc.* -filer. Hvordan vil denne situasjonen endre seg med den nye flate konfigurasjonen?
Takk på forhånd
Svar #1
Her er hva jeg gjorde for å løse problemet,
npm i --save-dev @eslint/eslintrc- Importer
FlatCompattil dineslint.config.jsfra@eslint/eslintrc-pakken. - Opprett og konfigurer en
compat-innpakning avFlatCompatfor å oversette dine ESLintRC-stilkonfigurasjoner til flat-konfigurasjoner. - Wrapperen
compatbør oversette konfigurasjonen eksportert av@typescript-eslint/eslint-plugintil det tilsvarende flat-config-objektet.
Etter å ha gått gjennom alle trinnene, endte jeg opp med følgende eslint.config.json:
const typeScriptEsLintPlugin = require('@typescript-eslint/eslint-plugin');
const esLintConfigPrettier = require('eslint-config-prettier');
const { FlatCompat } = require('@eslint/eslintrc');
// Translate ESLintRC-style configs into flat configs.
const compat = new FlatCompat({
baseDirectory: __dirname,
recommendedConfig: typeScriptEsLintPlugin.configs['recommended'],
});
module.exports = [
// ESLint recommended flat config.
'eslint:recommended',
// Flat config for parsing TypeScript files. Includes rules for TypeScript.
...compat.config({
env: { node: true },
extends: ['plugin:@typescript-eslint/recommended'],
parser: '@typescript-eslint/parser',
parserOptions: {
ecmaVersion: 'latest',
sourceType: 'module',
},
plugins: ['@typescript-eslint'],
rules: {
'@typescript-eslint/no-unused-vars': 'error',
'@typescript-eslint/no-empty-interface': 'error',
},
}),
// Flat config for turning off all rules that are unnecessary or might conflict with Prettier.
esLintConfigPrettier,
// Flat config for ESLint rules.
{
rules: {
camelcase: ['error', { ignoreDestructuring: true }],
},
},
];Det er noen punkter å ta med seg:
- Wrapperen
compatbør vite om konfigurasjonen du ønsker å oversette. Hvis konfigurasjonen din utvider fraeslint:recommended, bør du girecommendedConfigtilFlatCompat-konstruktøren. Ellers vil du få:
ESLint: TypeError: Manglende parameter 'recommendedConfig' i FlatCompat-konstruktøren.
eslint-config-prettiertrenger ingen oversettelse da den eksporterer et kompatibelt flat-konfigurasjonsobjekt.eslint:recommendeder allerede tilgjengelig som flat config. Du kan imidlertid få følgende advarsel når du brukermodule.exports-syntaks:
ESLint: 'module' er ikke definert. (no-undef)
Dette kan fikses hvis du definerer node:true som en miljøvariabel. Ifølge dokumentasjonen ble dette problemet løst ved å bruke sourceType: 'module' i parserOptions-objektet i eslint.config.js. Dessverre klarte jeg ikke å bli kvitt feilen på den måten.
- Jeg isolerte all TypeScript-ESLint i en uavhengig flat-konfigurasjon. Du kan også ha en flat-konfigurasjon bare for parseralternativer ved å bruke
languageOptions-egenskapen. Det er mye fleksibilitet når man overstyrer flat-konfigurasjoner. Bruk det som gir mening for deg. - Ikke erklær den samme pluginen på nytt i flere flat-konfigurasjoner, ellers vil du få feil.
Svar #2
Enten @typescript-eslint/eslint-plugin eller eslint-config-prettier gir konfigurasjon i eslintrc-format i stedet for i eslint.config.js-format
Du kommer til å måtte erstatte dem (muligens med @typescript-eslint/eslint-plugin/eslint.config.js hvis det finnes en) eller pakke dem inn i en kompatibilitetsfunksjon, se https://eslint.org/blog/2022/08/new-config-system-part-2/#backwards-compatibility-utility
import { FlatCompat } from "@eslint/eslintrc";
const compat = new FlatCompat(...);
export default [
// mimic ESLintRC-style extends
...compat.extends("standard", "example"),
]
