npx tsc --noEmit --traceResolution 2>&1 | grep -i "global.d.ts" npx tsc --noEmit --listFiles | grep types
接了一份旧模块的全局声明,编译报 TS2717 Subsequent property declarations must have the same type,提示 Property 'id' must be of type 'number'。本地那份写的是 string。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,同名接口在不同文件里会做声明合并,同一个属性两次声明类型不一致编译器就拒绝合并。加载顺序决定哪一份先被读到,报错里只会显示其中一份的出处。
「TS2717 声明冲突」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。
接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。
处理上按这个顺序:用 traceResolution 看两个声明文件的加载顺序;找出重复的那一份 内容少的直接删掉;确实要扩展就改成接口继承 不要重写同名字段;改完重启语言服务 确认报错跟着消失。
改完只确认一件事:TS2717 不再出现 悬停看 id 只剩一种类型 跳转定义只落到一处。
