ESLint 合并导入后多出 type from,检查 prefer-inline 自动修复
eslint-plugin-import 2.32.0 合并类型导入与名为 from 的成员时,可能把语句分隔 token 也改掉。人工保留合法内联类型并限制修复范围。
ESLint 本来只提示同一个包被导入两次,执行 --fix 后却生成无法解析的 TypeScript。若使用 eslint-plugin-import 2.32.0,启用了 import/no-duplicates 的 prefer-inline,并从包里导入了名为 from 的成员,检查自动修复是否把关键字位置改成了 type from。
例如原代码是:
import type { Observable } from 'rxjs';
import { from } from 'rxjs';
两条导入可以合并,但受影响的自动修复可能产生:
import { type Observable, from } type from 'rxjs';
花括号后的 type 不属于这条 import 的合法语法。此时继续重复运行修复器,或更换 formatter,都不能代替纠正错误的编辑结果。
同名 token 被当作导入成员处理
2.32.0 的规则在把第一条 import type 改成内联类型导入时,会按已有标识符名称筛选 token,再在匹配的 token 前加 type。导入列表恰好含 from 时,语句里用来分隔模块名的 from 也可能进入同名匹配。
因此,规则发现重复导入并不一定错误,问题在修复文本。它与两条导入携带不同 import attributes、原本不能合并的情形不同:这里应保留一个合法的合并结果,而不是修改模块加载条件。
确认项目使用支持内联类型导入的 TypeScript 4.5 或更新版本后,可以人工修成:
import { type Observable, from } from 'rxjs';
保留原来的类型与值导入用途。不要把 Observable 改成普通值导入来消除语法错误,否则在启用保留模块语法等配置时,可能改变编译要求或运行时导入。
暂停有问题的修复范围
先恢复本次批量修复造成的无效改动,对相关文件人工合并,再运行不写文件的 lint 和类型检查。若自动保存仍会触发该修复,应暂时将相关文件从这条自动修复路径排除,或按团队配置临时调整 prefer-inline,观察是否引入其他导入诊断。
配置里的 prefer-inline 是带连字符的规则选项;核心 no-duplicate-imports 与插件 import/no-duplicates 也不是同一个规则 ID。不要改错规则后以为修复器已经关闭。
截至 2026 年 10 月 23 日,已核对的正式插件版本仍为 2.32.0。后续版本应以这两条原始 import 做回归:自动修复后的代码可解析、类型检查通过,再次运行 lint 没有继续改写;其他普通重复导入仍正常报告。不要只检查修复器退出码,批量修改的 diff 中尤其要留意模块字符串前多出的 type。


