Vue项目启动时ESLint检测node_modules中ts-toolbelt循环引用报错求助
我来帮你排查这个困扰你的问题——运行npm run vue-cli-service serve --port 1024时node_modules里ts-toolbelt报4111:10 Type alias 'MergeList' circularly references itself的错误。这类问题大多和依赖版本不兼容、类型检查配置有关,下面是几个可以尝试的解决方案:
1. 升级/锁定ts-toolbelt版本
这个循环引用的问题在ts-toolbelt的旧版本里是已知的,你可以先检查当前项目里的ts-toolbelt版本:
npm list ts-toolbelt
如果版本较老,直接升级到最新稳定版:
npm install ts-toolbelt@latest --save-dev
如果ts-toolbelt是某个依赖的间接依赖,你可以在package.json里强制指定版本(npm需要借助npm-force-resolutions工具,yarn直接支持):
在package.json中添加:
"resolutions": { "ts-toolbelt": "^9.6.0" }
然后重新安装依赖:
- 对于npm:先全局安装工具
npm install -g npm-force-resolutions,再执行npm-force-resolutions && npm install - 对于yarn:直接执行
yarn install
2. 调整TypeScript配置
确保你的tsconfig.json没有对node_modules目录进行类型检查,检查exclude字段:
{ "compilerOptions": { // 你的其他TypeScript配置 }, "exclude": ["node_modules", "dist"] }
另外,也可以尝试让Vue CLI转译ts-toolbelt(通常不建议转译node_modules,但部分依赖需要),修改vue.config.js:
module.exports = { transpileDependencies: [ 'vuetify', 'ts-toolbelt' // 添加这一行 ], pwa: { workboxOptions: { skipWaiting: true, }, }, };
3. 清理缓存并重新安装依赖
缓存或损坏的依赖文件也可能导致这类奇怪的错误,执行以下步骤:
# 删除依赖目录和锁文件 rm -rf node_modules package-lock.json # 清理npm缓存 npm cache clean --force # 重新安装依赖 npm install
之后再重新启动服务试试。
4. 排查ESLint配置影响
虽然你的.eslintrc已经排除了node_modules,但可以暂时调整配置来确认是否是ESLint触发的类型检查:
- 暂时从
extends里移除@vue/typescript,重新运行服务,如果报错消失,说明是ESLint的TypeScript规则和ts-toolbelt冲突,你可以尝试升级@vue/typescript-eslint相关插件版本,或者针对性关闭相关规则。
如果以上方法都无效,你可以尝试降级TypeScript版本——比如当前使用TypeScript 5.x的话,可能和旧版ts-toolbelt不兼容,降级到4.9.x版本试试:
npm install typescript@~4.9.0 --save-dev
内容的提问来源于stack exchange,提问作者Bruno Francisco

