DEBUG.WIKI
IPPeak:从目标地区访问网页,住宅代理、SEO 监测、广告验证
OnlineSIM:在线接收短信,虚拟号码租用
野草云;香港 200Mbps 峰值;不限月流量 · BGP VPS;查看套餐 →

JSON 字段已经补回,TypeScript 仍报 TS2741:检查增量诊断缓存

JSON 字段补回后仍报 TS2741,可能是原生 TypeScript 的增量诊断未刷新。保留缓存做对照,区分实际文件错误,并验证后续增量恢复。

语言包JSON已经重新包含必填字段,类型检查却一直报“字段缺失”,错误中显示的还是之前那个空对象。若项目启用了 incremental 和 resolveJsonModule,可以先对照一次不使用旧构建信息的检查,区分真实类型错误与缓存下来的旧诊断。

具体回归在 TypeScript 7.0.2、7.1.0-dev.20260825.1出现:首次正确,删掉JSON字段后能报错,把字段补回却不清除错误。相同文件变化顺序在5.9.3能正常恢复。本文不适用于磁盘上的JSON实际上仍缺字段,或项目读取了另一份同名文件的情况。

识别“正确、错误、修好仍错”的顺序

一个最小类型依赖是:

import type data from './data.json';

type RequiredData = { title: string };
type Accept<T extends RequiredData> = T;
export type Check = Accept<typeof data>;

对应JSON原来是 {"title":"hello"},改成 {} 时应报 TS2741,再改成 {"title":"fixed"} 时应恢复。需要结合真实项目配置使用这一说明,不要为了验证缓存问题修改正在运行的生产语言包。

先确认错误指向哪个JSON模块及其使用方,并核对构建进程的工作目录。resolveJsonModule 让编译器根据JSON内容建立类型;如果构建读取的是生成目录中的旧副本,仅修改源文件还不够。

保留构建信息后做一次对照

找到项目实际使用的 .tsbuildinfo。它可能由 tsBuildInfoFile 显式指定,也可能位于编译器根据配置选择的位置,不能一律当成项目根目录的 tsconfig.tsbuildinfo。

在独立工作目录中,保存配置、相关JSON及旧构建信息,再仅移开这一项目生成的缓存文件,运行原来的类型检查入口。该文件是增量构建信息,移开后会增加下一次完整检查的工作量;不要顺手清理整个工作区缓存、依赖目录或其他项目的构建状态。

若文件内容完全未变,移开缓存后错误消失,继续重复一次“有效、缺字段、恢复”的文件变化顺序。只做干净构建成功,尚不能证明后续增量检查会正常恢复。若干净检查仍失败,应按新的实际诊断处理,不再沿缓存分支反复清理。

普通、非composite项目也可在诊断配置中临时关闭 incremental,但项目引用与 composite 有独立约束,不能把该开关直接塞进所有构建。不要为让构建变绿而删掉原有JSON类型校验或用 any 覆盖导入类型。

文件变化已被看见,依赖诊断仍可能没刷新

这一回归并非简单的“编译器没监听到JSON”。JSON内容的版本信息可以已经变化,使用方的旧语义诊断却仍被复用。修复于2026年9月1日合入:JSON没有可供比较的声明输出形状,因此改用文件版本来使依赖检查失效,并覆盖先删字段、再补回的顺序。

安装版本是否包含修复仍要单独确认。7.0.2发布于这次合并之前,不能用问题已关闭来证明它已修复;随意换到一个叫nightly的包,也不能代替准确版本与回归行为检查。

对必须稳定构建的项目,可先评估不复用受影响增量状态,或采用已确认包含修复的编译器组合。记录因此增加的构建时间,但不要编造一个通用性能差值。

最终应同时满足两件事:JSON真的缺字段时仍失败,补回后不清缓存也能恢复。CI恢复时还应核对是否重新下载了旧构建缓存,缓存键是否区分编译器版本和项目配置;不要把每次全量清理当成已经修复了增量行为。