大多数团队以为 tsc –noEmit 绿了就能升 7.0,结果 CI 全红——这件事今天把 TypeScript 7.0 的真实迁移成本彻底扒开了
大多数团队以为 tsc --noEmit 绿了就能升 7.0,结果 CI 全红——这件事今天把 TypeScript 7.0 的真实迁移成本彻底扒开了。
tsc 绿了,不等于你准备好了。
TypeScript 7.0 的 Go 重写编译器跑出了 10 倍速,VS Code 全量类型检查从 125 秒降到 10 秒,这个数字所有人都爱。但真正在团队里发生的不是”终于能跑快了”——是升级当天 CI 全红、找不到根因、一路回滚。
根子在这里:tsc --noEmit 只回答一个问题:你的代码类型对不对。7.0 的类型系统和 6.0 比几乎没有变化,所以大多数项目的类型检查确实会绿。但这个”绿”把两个真正让你 CI 红的东西全遮住了。
第一刀:tsconfig 里的废弃选项,现在直接报错。
ES5 target 整个被删了。"target": "es5" 在 6.0 的时候是一条警告,你大概瞟了一眼就 scroll 过去了。7.0 上来直接报错,不认这个字段。
AMD、UMD、SystemJS 模块格式全删了。如果你的打包配置里还写着 "module": "amd" 或者 "module": "system",7.0 不跟你客气。
moduleResolution: "node" 和 "node10" 也没了,官方推荐换成 "nodenext" 或者 "bundler"。
还有一个最阴的:ignoreDeprecations 这个字段本身被删了。如果你之前加了这个 escape hatch 来压制警告,7.0 根本不认这个配置,直接报错。你得回头去把真正的废弃项修掉。
这堆东西在 tsc --noEmit 下全部不触发——因为它只管类型,不管 tsconfig schema 解析。
第二刀:types 数组现在默认是空的。
这是最容易让大型项目 CI 全红的一刀。6.0 的时候,@types/node、@types/jest、@types/mocha 这些全局 ambient 类型是自动引入的。7.0 把 types 默认为空数组,意味着这些类型包不再自动注入。
如果你的 tsconfig 从来没写过 "types": [] 这行,现在它们凭空消失了。依赖这些全局类型的代码会报 找不到名称"test"、`process 未定义,全在类型层面炸开。tsc –noEmit` 会报这些错——但很多团队在这个阶段才第一次完整跑类型检查,之前 IDE 里的警告早就习惯性忽略掉了。
第三刀:rootDir 默认值变了。
之前 rootDir 默认跟着你 tsconfig 的位置走,现在默认变成 ./。如果你的 tsconfig 放在项目根目录但源码在 src/ 下,输出的目录结构会完全变形。这个迁移文档里很少提,但 monorepo 里影响最广——一个根 tsconfig 配了 references 的项目,这一下会让所有子包的输出路径全部重写。
为什么 monorepo 特别疼。
大多数 monorepo 的 tsconfig 里有两层经典操作:第一层是根目录的 tsconfig.base.json 定义了所有共享的 compiler options;第二层是各子包继承这个 base。如果 base 里有一条废弃选项,所有子包在同一秒全红。8 个包同时报 AMD 模块错误,感觉像是地震,其实是同一行 base 配置在所有子包作用域里同时触发。
正确做法:分阶段升级,而不是一步到位。
第一阶段先升级到 6.0,把所有 deprecation 警告修干净。把 ignoreDeprecations 删掉,把废弃的 tsconfig 字段换掉,把 types 数组按需填上。这个阶段完成后,tsc --noEmit 应该完全干净,没有任何警告。
第二阶段装 @typescript/native-preview。这是 Go 编译器在 7.0 正式发布前的预览包,可以在 CI 里单独跑 tsgo --noEmit 做类型检查,速度已经比旧编译器快 10 倍,还不破坏现有的 ESLint 和 typescript-eslint 集成。生产构建里保留 tsc 6.0 做 emit,等 7.1 正式 API 稳定后再切。
第三阶段才做完整升级。7.1 预计在 2026 年 10 月左右发布,届时 typescript-eslint、Volar(Vue 的 TypeScript 语言服务)等依赖编译 API 的工具会同步兼容。这才是可以全面切的时机。
什么时候值得现在就跑。
新项目,没有历史 tsconfig 包袱,直接装 7.0 没毛病。
有 monorepo 但用的是现代工具链(Vite + Rolldown,不依赖 AMD/SystemJS),先把 tsconfig.json 里 deprecated 字段清一遍,然后走三阶段路径。
还在用 Angular/NestJS 等依赖装饰器的老项目——这批工具的 7.0 兼容版本还没出,不要动。
一件事。
TypeScript 7.0 是微软近年来最漂亮的一版工程更新。但漂亮和能用是两回事。升级前先把 tsc --noEmit 放一边,跑一遍 grep -rnE '"(importsNotUsedAsValues|keyofStringsOnly|out|prepend|charset|ignoreDeprecations|noImplicitUseStrict)"' --include=tsconfig*.json .,把配置文件里所有废弃选项先清干净——这才是 7.0 升级真正的起点。
评论区
登录后可评论。