微软用 Go 重写了 tsc:VS Code 那 150 万行编译从 77.8s 降到 7.5s
TypeScript 编译器正在被用 Go 重写。这个原生移植(native port)项目代号 Corsa,产物就是 TypeScript 7;现有的 JS 实现对应 TypeScript 6。
官方说明是 Anders Hejlsberg 的博客《A 10x Faster TypeScript》,发布于 2025-03-11。代码在 microsoft/typescript-go,该仓库作为 staging 已完成并归档,代码合回了主仓库 microsoft/TypeScript。
为什么要重写
代码库一大,tsc 的加载和检查时间就压不住。编辑器这边更尴尬:要么启动快,但语义不完整;要么等到完整语义出来,启动就慢。这两者只能选一个。原生实现的目标是编辑器启动时间大幅改善、多数项目构建时间降 10 倍、内存占用显著下降。
官方基准
跑的是 tsc,各项目数据如下:
| 项目 | 行数 | 旧实现 | 原生实现 | 加速 |
|---|---|---|---|---|
| VS Code | 1,505,000 | 77.8s | 7.5s | 10.4x |
| Playwright | 356,000 | 11.1s | 1.1s | 10.1x |
| TypeORM | 270,000 | 17.5s | 1.3s | 13.5x |
| date-fns | 104,000 | 6.5s | 0.7s | 9.5x |
| tRPC server+client | 18,000 | 5.5s | 0.6s | 9.1x |
| rxjs | 2,100 | 1.1s | 0.1s | 11.0x |
编辑器场景单独看一组:VS Code 代码库整项目加载从约 9.6s 降到 1.2s,约 8 倍;内存约为旧实现的一半,而且这部分还没有专门做过优化。
怎么用
预览包发布在 npm 上,包名 @typescript/native-preview:
npm install @typescript/native-preview
npx tsgo
tsgo 直接当 tsc 用。到 TypeScript 7.0 RC 及之后的版本,命令名就是 tsc,不需要再记这个别名。
编辑器里可以装 VS Code 预览扩展 TypeScriptTeam.native-preview,然后把设置项开起来:
{
"js/ts.experimental.useTsgo": true
}
功能状态
README 里给了一张状态表,分三档。
已完成(done):Program creation、Parsing / scanning、tsconfig 解析、Type resolution、Type checking、JS + JSDoc 推断、JSX、Declaration emit、Emit(JS)、Watch mode、Build mode / project references、Incremental build。
这一档的行为对齐口径是:相同的语法错误、相同的类型错误位置与消息。也就是说,编译报错不会因为你换了实现而换了一套说法。唯一的例外是声明输出——这里有意与旧版不同,更接近 TS 声明文件的形态,所以 .d.ts 的 diff 需要单独过一遍。
进行中(in progress):Language service(LSP),大部分功能已经实现。这一块同时做了一件顺带的事:从旧的自研协议转向 LSP。
未就绪(not ready):API。
有意差异的完整清单在仓库的 CHANGES.md 里,升级前值得对着读一遍。
版本路线
两条线并行:JS 代码库继续走 6.x,TS 6.0 会引入一批与 native 对齐的废弃和破坏性改动;native 实现达到足够对等之后,发布为 TypeScript 7.0。两个版本会尽量保持对齐,项目可以按需升级,也可以回退。
取舍与不兼容点
不是所有项目都能一上线就切到原生实现。依赖旧 API、旧配置等约束的项目,得继续留在 TypeScript 6——API 一侧目前还是 not ready,语言服务也还在补。Go 原生实现带来了并发和内存上的优势,代价是语言服务和 API 生态需要重新适配。
换句话说,编译和类型检查这条路径现在就能拿 tsgo 试;工具链里那些依赖 TypeScript 编译器 API 的东西,还得等。
项目地址与公告
- 官方博客《A 10x Faster TypeScript》(Anders Hejlsberg,2025-03-11):https://devblogs.microsoft.com/typescript/typescript-native-port/
- 原生实现仓库(staging,已归档,代码合回主仓库):https://github.com/microsoft/typescript-go
- 主仓库:https://github.com/microsoft/TypeScript