专题归档 · 2026 年 3 月(编辑分组,非实际写作日期)
MemoFlow:两个 Vite 依赖分支,为什么 TypeScript 说类型不兼容
pnpm Monorepo 中同名 Vite Plugin 出现类型不兼容,如何追查重复依赖。
错误提示最奇怪的地方
旧项目在 vite.config.ts 配置 Electron 插件时,TypeScript 报过 No overload matches this call。堆栈里甚至出现了近似“同名的类型互不兼容”的描述:Plugin<any> 看起来还是那个 Plugin<any>,为什么不能传进去?
真正值得看的不是报错文字第一行,而是两个类型的导入来源路径。
从 pnpm 路径看见了两套依赖身份
原始堆栈显示,项目里存在两套相同 Vite 版本、但附着不同 @types/node 与 jiti 组合的依赖路径。堆栈的深处还出现 _pluginContextMap 这样的私有属性;带私有成员的类类型不会仅凭外形一致就被认为可兼容。
这次排障思路因此从“插件类型声明写错了吗”转到“为什么这个项目装出了不同身份的 Vite 插件类型”。
当时记录的修复方向
笔记给出的处理是收敛相关依赖分支,并用 pnpm override 显式约束容易分叉的版本。这里重要的是消除重复类型来源,而不是机械复制当时的具体版本号——项目后来升级时,固定旧版本可能产生新的冲突。
这次先将问题缩小到了重复依赖可能造成两份插件类型的方向。要确认是否真正消除错误,还要对照锁文件、干净安装后的依赖树及 TypeScript 检查结果。