TypeScript 7.0 RC 来了:编译器用 Go 重写,10 倍提速
TypeScript 7.0 RC 将编译器核心从 TypeScript 移植到 Go,大型代码库构建速度提升 8-12 倍。这篇文章聊聊这次重写为什么是 Go 而不是 Rust、实际表现如何、以及迁移时需要注意什么。
7 月 8 号,微软正式发布了 TypeScript 7.0 RC。这不是一个普通的版本号跳跃——编译器核心从 TypeScript/JavaScript 完整移植到了 Go,在大型代码库上构建速度普遍快了 8 到 12 倍。
我在一个中型的 monorepo 上试了试(大概 800 多个 TS 文件),tsc --noEmit 从 42 秒降到了 4.3 秒。这个差距不是渐进优化能做到的,是换了一种材料。
这不是一个新语言版本
先说清楚一个容易误会的地方:TypeScript 7.0 不包含新的类型系统特性,也没有新的语法。类型推断逻辑、错误信息、边界情况——这些和 TypeScript 6.0 保持一致。
微软在 RC 公告里写得很直白:Go 版本的代码「是从现有实现 methodically ported 过来的,不是从头重写,类型检查逻辑在结构上和 TypeScript 6.0 完全相同」。他们跑了大约两万个测试用例,最终只有 74 个产生了不同的错误输出。
所以这本质上是一个性能版本,套了一个 major 版本号。升级后你的类型不会变,你依赖的推断不会变,你背下来的那些边界情况——都还在。
为什么选 Go
2025 年 3 月微软宣布这个移植计划的时候,圈子里问得最多的问题就是:为什么是 Go,不是 Rust?
TypeScript 团队的技术负责人 Anders Hejlsberg 在当时的讨论里提了几个点。Go 的 goroutine 和 channel 模型对于编译器这种大量并发任务、需要共享状态的场景非常自然。编译器内部有大量需要共享的类型图、符号表、模块解析缓存——用共享内存比消息传递要高效得多,Go 在这件事上开箱即用。
Rust 当然能做,但所有权模型在这种高度互联的数据结构上需要大量 Arc<Mutex<>> 或 unsafe 块,开发效率会大打折扣。团队的选择逻辑很实际:编译器是一个内部工具,不需要最大化运行时的每纳秒,但需要能快速迭代和维护。Go 在"写得快"和"跑得快"之间的那个平衡点,恰好踩中了编译器开发的需求。
另外 Go 编译出来的单一静态二进制文件也让分发变得简单了很多。以前 npm 安装 typescript 需要处理不同平台的 Node.js 绑定,现在一个二进制解决问题。
并行化是怎么做到的
TypeScript 6.0 及之前的 tsc 本质上是单线程的。JavaScript 当然有 Worker,但共享内存的限制让编译器这种重度依赖全局状态(类型图、模块图)的程序很难做细粒度并行。
Go 版本从架构上重新设计了构建流程。解析(parsing)、类型检查(type-checking)、代码输出(emit)这三个阶段都可以在不同文件之间并行执行。解析显然可以——每个文件独立 parse。类型检查稍微复杂,需要在文件间做依赖分析,但只要构建出依赖图,没有循环依赖的文件就可以同时检查。emit 更是天然并行的。
微软的说法是「并行化机制能在较低开销下自动适配更大规模的代码库」。我在自己的项目里观察到的是,文件越多,加速比越接近线性——800 个文件 10 倍加速,2000 个文件可能会更明显。
缺点是内存占用。Go 版本的峰值内存大概比 JS 版本高 30%-50%,并行带来的代价。不过对于 CI 机器来说,拿内存换时间通常是一笔划算的买卖。
迁移要注意什么
第一个坑是程序化 API。TypeScript 7.0 不提供稳定的程序化 API——这个要等到 7.1。如果你有工具链直接 import ts from 'typescript' 然后用 ts.createProgram() 之类的 API,升级到 7.0 之后这些调用会直接挂掉。
微软给了一个过渡方案:@typescript/typescript6 兼容包。这个包里有一个 tsc6 可执行文件,以及完整的 TS 6.0 API 导出。你可以在项目里同时装 typescript@7(提供 tsc)和 @typescript/typescript6(提供 tsc6 和旧 API),让构建走 7.0 的快速路径,而依赖旧 API 的工具继续用 6.0。
第二个是 CI 流程。如果你在 CI 里用 npx tsc --noEmit 做类型检查,升级后这条命令会快很多——但记得把 cache 策略也调整一下,因为 AST 和类型图的内部表示变了,旧缓存不能复用。
第三个是编辑器集成。VS Code 的 TypeScript 支持需要等编辑器更新才能用上 7.0 的语言服务。目前 RC 阶段,建议构建用 7.0、编辑器继续用 6.0(通过 workspace 级别的 TypeScript 版本设置分开控制)。
正式版什么时候来
微软说 RC 之后计划在一个月内发布正式版,也就是大概率 8 月上旬。正式版之前主要处理发布流程、已报告的回归问题、以及 7.1 的 API 规划。
我的建议是:如果你的项目没有深度依赖 TypeScript 编译器 API(大多数项目都没有),现在就可以在新分支上试 RC。构建速度的提升是实打实的,而且类型检查行为几乎不变,回归风险很低。等到 7.1 稳定 API 出来之后,再把工具链平滑迁移过去。
这不是 TypeScript 变得更快了,是 TypeScript 换了一个跑得更快的引擎。对于每天都在等 tsc 跑完的人来说,这大概是最好的消息了。