You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESLint 8与TypeScript集成报错求助:AWS CDK项目升级问题

ESLint 8.x + TypeScript + Jest 集成踩坑修复(解决未解析Promise的AssertionError)

核心问题

升级ESLint到8.x后,旧TypeScript项目里用Jest跑ESLint测试时,lintFiles()返回未解析的Promise,直接断言会触发AssertionError;同时ESLint官方文档仅提供Node.js迁移指南,缺失TypeScript相关适配细节。

解决方案一步步来

1. 对齐依赖版本

旧项目里的eslint-plugin-typescript已废弃,必须替换为@typescript-eslint系列包,同时确保@types/eslint与ESLint主版本匹配。参考依赖配置:

{
  "devDependencies": {
    "eslint": "^8.57.0",
    "@types/eslint": "^8.56.10",
    "@typescript-eslint/eslint-plugin": "^7.10.0",
    "@typescript-eslint/parser": "^7.10.0",
    "jest": "^29.7.0",
    "typescript": "^5.4.5"
  }
}

执行npm install或pnpm install更新依赖。

2. 修复Jest测试代码(关键:处理异步逻辑)

ESLint 8.x起lintFiles()改为异步返回Promise,必须用async/await处理,不能再用同步写法:

原错误代码

import { ESLint } from 'eslint';

test('ESLint should pass without errors', () => {
  const eslint = new ESLint({ fix: false, useEslintrc: true });
  const results = eslint.lintFiles(['src/**/*.ts']);
  expect(results).toHaveLength(0); // 拿到的是Promise而非结果数组,断言必失败
});

修改后正确代码

import { ESLint } from 'eslint';

// 给测试函数加async,用await等待Promise解析
test('ESLint should pass without errors', async () => {
  const eslint = new ESLint({ fix: false, useEslintrc: true });
  const results = await eslint.lintFiles(['src/**/*.ts']);
  
  // 检查所有文件的lint结果是否存在错误
  const hasErrors = results.some(result => result.errorCount > 0);
  expect(hasErrors).toBe(false);
  
  // 可选:调试用,打印具体错误信息
  if (hasErrors) {
    results.forEach(result => {
      result.messages.forEach(msg => {
        console.error(`[${result.filePath}] ${msg.message} (规则:${msg.ruleId})`);
      });
    });
  }
});

重点提醒:不要直接断言结果数组长度——即使无错误,lintFiles()也会返回每个被检查文件的结果对象,长度不等于0,正确逻辑是检查每个结果的errorCount。

3. 修正.eslintrc配置(适配8.x+TS)

替换废弃的解析器与插件,使用@typescript-eslint标准配置:

{
  "env": {
    "node": true,
    "jest": true,
    "es2021": true
  },
  "parser": "@typescript-eslint/parser", // 必须使用该TS解析器
  "parserOptions": {
    "ecmaVersion": "latest",
    "sourceType": "module",
    "project": "./tsconfig.json" // 需要类型检查则添加,无需则删除
  },
  "plugins": ["@typescript-eslint"],
  "extends": [
    "eslint:recommended",
    "plugin:@typescript-eslint/recommended",
    // 开启project后,添加带类型检查的规则集
    "plugin:@typescript-eslint/recommended-type-checked"
  ],
  "rules": {
    // 自定义规则示例:禁止未使用变量
    "@typescript-eslint/no-unused-vars": "error"
  }
}

常见坑排查

  • AssertionError仍出现:检查测试函数是否加了async、lintFiles()前是否加了await——90%是异步逻辑未处理正确。
  • ESLint扫不到TS文件:确认lintFiles()的路径通配符覆盖源码文件,且tsconfig.json包含这些文件。
  • 依赖冲突:执行npm ls eslint @typescript-eslint/parser检查是否存在多版本依赖,若有则删除node_modules和锁文件后重新安装。

内容的提问来源于stack exchange,提问作者GForce

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 01:35:15