ESLint 报 import is duplicated,先看两条导入的 with 属性是否相同
ESLint 10.13.0 不按 with 属性区分同模块导入。确认 resolution-mode 是否选择不同类型条件,保留必要声明并仅设局部例外,不机械合并。
两个 import 写着同一个模块名,ESLint 报 import is duplicated. (no-duplicate-imports),但两条语句的 with { ... } 属性不同。先核对加载语义,不能为消除提示就把它们合成一条,丢掉其中一组属性。
ESLint 10.13.0 的 no-duplicate-imports 会比较模块名和导入形式,没有把不同属性作为独立的不可合并条件。这不是通过一次升级就必然消失的错误;应先判断当前代码究竟需要两种解析,还是确实存在可合并的重复。
同一模块名不一定选择同一份类型
TypeScript 5.3 起正式支持在 import type 中用 resolution-mode 选择解析条件。下面是包的类型声明确实分别导出相应名称时的示例,需使用支持该语法的 TypeScript 与 ESLint parser:
import type { TypeFromRequire } from 'pkg' with {
'resolution-mode': 'require',
};
import type { TypeFromImport } from 'pkg' with {
'resolution-mode': 'import',
};
如果 pkg 的条件 exports 分别把 require 与 import 指到不同类型文件,这两条声明可能具有不同含义。一条 import 只能携带一组属性,直接合并命名导入会失去其中一种解析条件。这里的 pkg 和类型名是占位示例,必须换成真实包的导出,不能照抄后据不存在的包判断工具故障。
同样,运行时的 type: 'json'、type: 'text' 或其他属性能否使用,取决于目标运行时与加载器。解析器接受语法,不证明 Node、浏览器或打包器支持这些类型;不要为了复现 lint 提示给 JSON 随意换一个不支持的加载类型。
不要用 allowSeparateTypeImports 处理两条类型导入
allowSeparateTypeImports: true 允许类型导入与值导入分开,但这里两条都是 import type。10.13.0 的规则实现仍会比较它们,并不会因这个开关自动跳过不同的 resolution-mode。
先查看生效配置与实际规则 ID,区分核心 no-duplicate-imports、插件内同名规则和编辑器的另一套诊断。若属性相同、导入形式确实能合并,正常合并即可;没有必要给整个项目关闭检查。
对于已经确认必须保留不同属性的少数声明,可以按项目规则允许局部例外。例如在第二条导入前使用:
// eslint-disable-next-line no-duplicate-imports -- 两条类型导入分别解析 require 和 import 条件
import type { TypeFromImport } from 'pkg' with {
'resolution-mode': 'import',
};
这段接在上面的第一条导入后,替换原第二条;项目若禁止 inline config,需走审定的文件级配置,不能假定注释一定生效。例外只说明这次不由该规则判断,并不替代 TypeScript 对两条声明的检查。
改动后保留原始属性,让类型检查器分别解析 require 与 import 分支,并确认用到的类型和最终产物没有被更换。仅 lint 变绿不足以验收:删除第二条导入、改掉解析条件或把所有规则关掉,都能让提示消失,却可能改变需要检查的类型。其他同模块、同属性的真正重复导入仍应继续报告。


