如何避免TypeScript编译生成代码触发eslint的no-multi-assign错误
问题原因
这个报错并不是你写的TypeScript源码有问题,是TypeScript将ES模块规范的导出代码编译为CommonJS规范产物时,为了兼容循环导出等边界场景,会自动生成exports.xxx = exports.yyy = void 0这类链式赋值代码,且你的ESLint校验范围包含了编译后的JS产物文件,才会触发no-multi-assign规则报错。你调整源码导出写法没有效果,就是因为问题根源和源码导出逻辑无关,是编译产物的自动生成逻辑导致的。
最优解决方案(从根源规避)
按优先级从高到低选择即可:
- 方案1:调整TS编译配置,输出原生ES模块
如果你的运行环境(Node.js 14.13+、现代浏览器、前端构建工具)支持原生ES模块,修改tsconfig.json配置即可:
调整后TS不会再转译ES模块导出为CommonJS格式,自然不会生成链式赋值的编译产物。{ "compilerOptions": { "module": "ESNext", "moduleResolution": "NodeNext", // 其他原有配置保持不变 } } - 方案2:排除ESLint对编译产物的校验
绝大多数场景下,ESLint只需要校验你编写的源码文件,不需要校验编译后的产物。直接把你的编译输出目录(通常是dist、build)添加到项目根目录的.eslintignore文件中即可:
配置后ESLint不会再扫描编译后的JS文件,自然不会触发对应报错。# .eslintignore 新增内容 dist/ build/
兜底方案
如果确实需要编译为CommonJS格式,同时必须校验编译后的JS文件,可以调整ESLint规则,只忽略CommonJS导出场景的链式赋值报错,在.eslintrc.js中添加规则配置:
module.exports = { rules: { 'no-multi-assign': ['error', { ignoreNonDeclaration: true }] } }
该方案侵入性较高,不推荐优先使用。
内容的提问来源于stack exchange,提问作者shubhendu madhukar
相关产品推荐
相关产品推荐

