pnpm why @types/node -r
pnpm up @types/node@20.11.30 -r -w
npx tsc --noEmit --explainFiles | grep '@types/node'

构建报 TS2717 Subsequent property declarations must have the same type,定位到两个不同版本的 @types/node 同时进了类型空间,一个是 18 一个是 20。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:类型包按版本各自声明全局变量,两份同时被 include 就会对同一个名字给出不同类型。pnpm 的严格隔离让子包各自解析到自己的版本,类型检查时全被拉进来。

这次卡住的地方就在「类型定义重复」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。权限不要一口气开到最大,先加到够用再往上试,范围小才好收。

把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。

验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。

处理上按这个顺序:根目录 overrides 固定 @types/node 一个版本;各包 package.json 里改成 peer 或 dev 统一版本;用 pnpm why @types/node 找出谁带了旧版本;tsconfig 的 types 字段显式限定 不要全量引入。

确认没问题再收工,pnpm why 只剩一个 @types/node 版本 tsc 不再报 TS2717。

作者 9823189