TypeScript 报错指的那一行,往往不是真正出问题的地方。编译器报的是「可赋值性最终崩掉」的位置,而根因通常是上游某个文件里少了一个属性、或者某处推断错了。那堵七行长的 Type A is not assignable to type B 报错墙是真的吓人,于是很多人一句 as any 糊上——结果只是把 bug 从编译期挪到了运行时。
下面这些 Prompt 会强制模型从报错行反推真正原因、把「该修代码」和「该修类型」分开,并给出最小 diff 而不是大改。使用时请把完整报错链加上下文代码一起贴进去,别只截图或丢一句话概要。TS 报错的第二、第三行常常才点出真凶,记得一起带上。
一句话总结
- 贴完整报错(所有行,含文件名)加上 20-30 行上下文代码。TS 报的那一行通常在真错位置的下游。
- 默认用 Prompt 1(反推诊断)。当你已经知道是哪一类问题(泛型、收窄、模块解析)时,再用对应的专用 Prompt。
- 2026 年 6 月在这类任务上表现好的模型:Claude Opus 4.7 和 Sonnet 4.6(1M token 上下文,SWE-bench Verified 87.6% 领先)、GPT-5.5、Gemini 3.1 Pro。大上下文在这里很关键,因为 TS 报错往往横跨多个文件。
- 别让模型用
any或as来「修」。在 Prompt 里写清楚:「修底层形态,别治标」。 - 这些 Prompt 与版本无关,但请标明你的 TS 版本。TS 5.9、过渡版 6.0、用 Go 重写的 7.0(自 2026 年 4 月 21 日进入 beta,稳定版预计 7 月前后)行为有差异。
这套 Prompt 适合用在哪
- 日常 TS 开发与 PR 评审
- 调库类型 /
@types不一致 - JavaScript 迁移到 TypeScript
- 熟悉一个陌生的 TS 代码库
- 开了某个
strict开关后冒出几百个新报错时救命
该贴给哪个模型
| 模型(2026 年 6 月) | 上下文 | 为什么适合诊断 TS 报错 |
|---|---|---|
| Claude Opus 4.7 | 1M token | 跨文件推理最强,SWE-bench Verified 87.6%。条件类型、推断链特别绕时用它。 |
| Claude Sonnet 4.6 | 1M token | 更快更便宜($3/$15 每百万 token,对比 Opus 的 $5/$25);日常 not assignable 够用。 |
| GPT-5.5 | Plus 应用内约 320 页 | CLI / 终端工作流强;遇到类型谜题在模型选择器里选 Thinking 模式。 |
| Gemini 3.1 Pro | 1M token | 免费版 Gemini 应用可有限使用 Pro(有每日额度限制);完整 1M 上下文需付费的 Google AI Pro($19.99/月),塞得下整个 tsconfig 加好几个文件。 |
上下文窗口是关键:TS 报错会引用散落在多个文件里的类型,1M token 让你一次把报错、出错文件和相关声明全贴进去。在 Claude Code 或 Cursor 里,agent 会自己读文件,所以可以省掉手动粘贴,直接把报错文本给它即可。
1. 反推诊断
下面是一条 TypeScript 报错。请从报错行反推真正原因。
严格按以下输出:(a) TS 以为哪里错;(b) 实际错在哪;(c) 最小修复 diff;
(d) 修代码还是修类型。不许用 `any` 或 `as`。
报错:
[贴完整报错,所有行,含文件名]
代码上下文:
[贴报错行附近 20-30 行]
2. “Type X is not assignable to Y” 诊断
TS 报 "Type [X] is not assignable to type [Y]"。请诊断:(a) TS 期望什么;
(b) 实际是什么;(c) 逐属性对比 X 与 Y 的结构差异;
(d) 是真 bug,还是 excess-property / 收窄造成的假象。
代码:
[粘贴]
3. 泛型推断失败
下面这个调用点上 TS 没能推断出泛型。请输出:(a) TS 尝试推断哪些类型参数;
(b) 哪个实参让推断退回到约束或 `unknown`;(c) 能让它通过的显式类型实参;
(d) 函数签名本身是否该改。注意:TS 5.9+ 在 --strict 下启用了 --strictInference,
请标出哪些推断会在严格模式下新失败。
[贴调用点 + 函数签名]
4. 条件类型调试
某条件类型选错了分支。下面是类型定义和一个样本输入。请逐步走过每个条件
(`extends` 判断、对联合类型的分发、`infer` 绑定),写出 TS 每一步算出什么。
[贴类型定义 + 输入类型]
5. 模块解析诊断
TS 报 "Cannot find module [X]" 或 "Module [X] has no exported member [Y]"。
请按顺序诊断:(a) tsconfig 的 `module` + `moduleResolution`(注意:`bundler`
允许无扩展名 import 且读 package.json "exports";`nodenext` 要求扩展名、更严格);
(b) 该包 package.json 的 "exports" 字段,子路径是否被映射;
(c) 包自带类型 vs @types 包 vs 缺失的 .d.ts;(d) 确切修复。
[贴报错 + tsconfig 的 compilerOptions + 相关 package.json 节选]
6. excess property 检查的困惑
为什么我把对象赋给变量再传时 TS 允许多余属性,直接内联传对象字面量却报错?
请解释 TS 的 excess-property 规则(它只对新鲜的对象字面量触发,对已带类型的值不触发),
并针对我的情况给出正确修法。
[贴通过的写法 + 报错的写法]
7. “类型保护没收窄” 诊断
我写了类型保护但 TS 仍对收窄后的类型报错。请诊断收窄为什么丢了:
(a) 这不是 user-defined 类型谓词(`x is Foo`);(b) 值是通过 TS 视为可变的属性访问读到的;
(c) 收窄在 `await`、闭包或回调里被丢弃;(d) 能保住收窄的修法。
[粘贴]
8. .d.ts / ambient 声明审计
我项目 import 了 [library] 但它的类型缺失或错误。请走一遍:(a) 包是否自带类型
(查 package.json 的 "types"/"exports");(b) 是否有 @types/[library];
(c) 我是否需要自写 .d.ts;(d) 给我 .d.ts 骨架,如果只需要补一个导出就用模块增强(module augmentation)。
[贴 imports + 报错]
9. tsconfig strict 修复
我开了 [strict | noImplicitAny | strictNullChecks | exactOptionalPropertyTypes |
strictInference] 后多了 [N] 个新报错。下面挑 5 条代表性的。请逐条分类
(真 bug / 只是类型 / 需要重构)并给修复模式。把相同模式归到一起,方便我批量修。
[贴 5 条报错 + 对应代码]
10. React 组件 prop 类型修复
我的 React 组件 props 报 TS 错。下面是组件 + 一处用法。请诊断:
(a) prop 类型 vs 使用差异;(b) 泛型组件推断问题;(c) 经过 HOC 或 `forwardRef` 丢类型;
(d) 最小修复。请优先用显式 interface 标注 props,而不是内联对象类型。
[贴组件 + 用法]
11. zod / valibot / runtime schema 与 TS 类型不一致
我的运行时 schema([zod / valibot / yup])和 TS 类型对不上。下面是 schema、
它推断出的类型(`z.infer<typeof schema>`)和手写类型。请诊断漂移原因,
并提出让其中一个成为唯一真源(single source of truth)、从此不再漂移的方案。
[贴 schema + 推断类型 + 手写类型]
12. “any” 大扫除
下面文件里有隐式和显式的 `any`。请逐处列出、解释为什么 TS 推不出来(或为什么有人加了它)、
提议显式类型。按风险排序:先处理碰到外部输入或函数边界的那些 `any`。
[粘贴]
13. 迁移:JS → TS 一文件一步
我在把 [file.js] 迁移到 TypeScript。请输出分步计划:(a) 先引入哪些类型;
(b) 对应运行时形态的 union / intersection 结构;(c) 哪些函数可以暂时宽松,并加 TODO 标记;
(d) 是先用 `allowJs` 模式还是直接转。
[贴文件]
14. TS 报错按影响分类
下面是 `tsc --noEmit`(TS 7 上则是 `tsgo --noEmit`)的报错。请分类:
(a) 真 bug(修代码);(b) 只是类型(修类型);(c) 需要重构;
(d) 用 `@ts-expect-error` + 原因注释抑制。按影响范围排序:先列挡住最多下游代码的报错。
[粘贴]
容易踩的坑
- 伸手就
any。 它让编译器闭嘴,把 bug 送到运行时,那里排查成本高得多。 - 完全信报错行。 它几乎总在真错位置的下游;让模型反推。
- 盲目
as强转。 一个掩盖结构差异的强转就是埋着的地雷。先搞清楚差异。 - 关
strict让 build 过。 那等于把用 TypeScript 的全部意义都丢掉了。该修就修,该抑制就逐行抑制。 - 只贴一行报错。 TS 报错是一条链,第二、三行往往才点出真凶。
- 跟类型系统硬刚而不是改形态。 类型难写,往往说明运行时形态本身就有问题。
常见问题
2026 年 6 月诊断 TypeScript 报错哪个模型最好?
难啃的跨文件场景用 Claude Opus 4.7,它在 SWE-bench Verified 上领先(87.6%),1M token 上下文塞得下报错加好几个文件。日常 not assignable 用 Sonnet 4.6,更便宜也够快。GPT-5.5(Thinking 模式)和 Gemini 3.1 Pro 都是好备选;免费版 Gemini 应用可有限使用 Gemini 3.1 Pro,完整 1M 上下文则需付费的 Google AI Pro($19.99/月)。
该贴整个文件还是只贴报错? 贴完整报错(每一行,含文件名)加 20-30 行上下文。如果报错引用了别处定义的类型,把那些声明也带上。在 Claude Code、Cursor 这类 agent 里就别贴了,让 agent 自己读文件,你给它报错文本和文件路径即可。
TypeScript 7.0 会改变这些报错的读法吗?
报错信息基本一样。TS 7.0(自 2026 年 4 月 21 日 beta,稳定版预计 7 月前后)是用 Go 重写的原生编译器,以 @typescript/native-preview 发布、命令为 tsgo,速度约快 10 倍,但产出的诊断信息相同。更明显的行为变化来自 TS 5.9 的 --strictInference 和 TS 6.0 改了的默认值,所以一定要告诉模型你的版本。
为什么 TS 有时允许多余属性、有时又不允许? excess-property 检查只对「新鲜的对象字面量」直接赋值或传参时触发。一旦值被存进带类型的变量,TS 就当它是那个类型、不再查多余属性。Prompt 6 讲了规则和修法。
怎么让模型别动不动建议 as any?
在 Prompt 里加上「不许用 any 或 as,请修底层形态」,就像上面模板那样。如果强转确实无法避免(无法改的第三方类型),就让它给出带注释说明为何安全的 as,并在边界处加一个运行时断言。