TypeScript 7.0 落地:tsc 快了 10 倍,模板类型检查还得留在 tsc6
TypeScript 7.0 于 2026-07-08 GA。编译器与工具链用 Go 重写,完整构建通常快 8x–12x:vscode 125.7s→10.6s(11.9x),sentry 139.8s→15.7s(8.9x),bluesky 24.3s→2.8s,playwright 12.8s→1.47s,tldraw 11.2s→1.46s;编辑器打开含错文件从 17.5s 降到 1.3s 内。
但升级不是把 typescript 版本号一改就完事。真正卡住落地的是 API 断档和工具链依赖。
7.0 不提供编程 API,模板检查仍要 6.0
7.0 只提供命令行编译器,不提供编程 API;新 API 要等 7.1。依赖编译器 API 的工具因此暂时只能用 6.0:typescript-eslint,以及 Vue、Svelte、Astro、MDX、Angular 的模板类型检查。Volar 这类把编译器嵌进语言服务的工具,走的正是旧 API。
这意味着一个 Vue 项目里,`` 部分可以用 7.0 的 tsc 检查,但 .vue 模板里的类型检查仍然得由 6.0 驱动。两者不能互相替代。
装两份:typescript 与 @typescript/typescript6
@typescript/typescript6 提供 tsc6 可执行文件,并重新导出 6.0 的 API,可以与 7.0 并存:
npm install -D typescript @typescript/typescript6
GA 之后 npm install -D typescript 装到的 tsc 就是新的 Go 二进制。此前预览包叫 @typescript/native-preview,命令是 tsgo;nightly 走 typescript@next。
package.json 里把两条检查链分开:
{
"scripts": {
"typecheck": "tsc --noEmit",
"typecheck:legacy": "tsc6 --noEmit",
"typecheck:watch": "tsc --noEmit --watch"
}
}
日常跑 npm run typecheck,涉及模板或 ESLint 类型感知规则时跑 npm run typecheck:legacy。
先把 6.0 调到可比状态
7.0 与 6.0 的类型检查逻辑结构一致。官方跑了约 20000 个测试用例,其中约 6000 个在 6.0 下就报错;除 74 个例外,7.0 也报同样的错。
要让两边的诊断结果可比,6.0 侧需要开启 stableTypeOrdering,并且不设置 ignoreDeprecations:
{
"compilerOptions": {
"stableTypeOrdering": true
}
}
不要在这个配置里出现 ignoreDeprecations 字段。否则 6.0 与 7.0 的报错顺序和去留可能对不上,灰度阶段会被噪声淹没。
并行度:--checkers、--builders、--singleThreaded
7.0 把解析、类型检查、emit 拆成多步并行。默认并行度对大多数项目够用,两个实验性 flag 用来调:
# 调整类型检查并行度
tsc --noEmit --checkers 4
# 调整 project references 构建并行度
tsc --build --builders 4
# 完全关闭并行
tsc --noEmit --singleThreaded
--singleThreaded 用于调试,或 CI 容器 CPU 配额很紧、并行反而增加调度开销的场景。--checkers 和 --builders 是实验性的,先在独立 job 里试,不要直接写进共享 tsconfig。
watch 模式换了实现
7.0 的 watch 模式重建过,文件监听基于 Parcel bundler 的 file-watcher 移植到 Go:避开纯轮询的开销,也不依赖 C++ 工具链,资源占用明显下降。命令不变:
tsc --noEmit --watch
对本地开发来说这是无感替换,但如果 CI 或脚本里依赖了旧 watch 的某些输出时序,升级后需要重跑一遍确认。
CI 灰度:先非阻塞,再翻转
不建议一次性把流水线切到 7.0。比较稳的做法是让 7.0 先以非阻塞方式跑一段时间:
jobs:
typecheck-7:
continue-on-error: true
steps:
- uses: actions/checkout@v4
- run: npm ci
- run: npx tsc --noEmit
typecheck-6:
steps:
- uses: actions/checkout@v4
- run: npm ci
- run: npx tsc6 --noEmit
typecheck-6 继续阻塞合并,typecheck-7 只出报告。观察一段时间后,把两边诊断做 diff,重点看那 74 个例外之外的差异;确认无新增错误后,再把 typecheck-7 的 continue-on-error 去掉。
包含 Vue、Svelte、Astro、MDX、Angular 模板检查的仓库,模板那一层继续留在 tsc6,不要跟着主检查一起翻。等 7.1 的新 API 落地、Volar 与 typescript-eslint 跟进之后,再拆掉 6.0 这条并存链。
7.0 声明不改变类型系统与语法,所以升级风险主要在工具链,不在语言本身。把 tsc 和 tsc6 两条命令管清楚,灰度就只是时间问题。