DEBUG.WIKI
京东云;让 AI 进入真实业务;零售 · 物流 · 客服 · 硬件;查看方案 →
RackNerd;$21.99/年 · 1GB KVM
Evoxt;最高 6.0GHz CPU;高频云服务器 · 免费每周备份;查看配置 →

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。