TypeScript 7.0 Go 重写深度拆解:当微软用 Go 重构 TypeScript 编译器——从 8.2 秒到 0.7 秒的架构革命
2026年7月8日,微软正式发布 TypeScript 7.0。这不是一个普通的版本迭代——这是 TypeScript 编译器自2012年诞生以来最激进的一次底层重构:微软将整个 TypeScript 编译器从 TypeScript/JavaScript 重写为 Go 原生实现。完整构建速度提升 8到12倍,超大型代码库(80万行级别)冷启动从189秒压缩到14秒。这是一个值得所有前端开发者、工具链工程师、以及对编译器技术感兴趣的人深入拆解的事件。本文将带你从架构设计、并发模型、性能数据、迁移路径四个维度,全链路理解这次重写的技术内核。
1. 背景:TypeScript 编译器为何需要重写
要理解 TypeScript 7.0 的意义,先得理解它的前世——为什么一个用 TypeScript 自己写的编译器,最终走到了需要用 Go 重写的地步?
1.1 自举编译器的两难困境
TypeScript 编译器(tsc)从诞生起就是用自己的语言写的。这是一种经典的「自举」(Bootstrapping)策略:编译器用自己的源码编译自己,既是语言成熟度的证明,也方便语言团队在语言层面迭代编译器功能。这种策略在语言发展早期是合理的,但随着 TypeScript 语言本身的复杂度指数级增长,编译器面临的挑战也越来越大。
传统 TypeScript 编译器架构包含以下核心模块:
| 模块 | 职责 | 性能特征 |
|---|---|---|
| 词法分析器(Lexer) | 源代码 → Token 流 | CPU 密集,串行 |
| 语法分析器(Parser) | Token 流 → AST | CPU 密集,串行 |
| 绑定器(Binder) | 建立符号表和作用域链 | 内存密集,串行 |
| 类型检查器(Type Checker) | 执行静态类型分析 | 性能瓶颈核心,CPU+内存双密集 |
| 发射器(Emitter) | AST → JavaScript/声明文件 | CPU 密集,可部分并行 |
在中小型项目中(代码量 < 5万行),这套架构运行良好。但当代码库规模达到数十万甚至百万行时,问题就来了:
问题一:垃圾回收的压力。 JavaScript/TypeScript 的垃圾回收器(V8 的 Orinoco)在处理大规模 AST(抽象语法树)时会产生明显的「Stop-the-World」停顿。编译器在类型检查阶段会创建和销毁数十万个临时 AST 节点对象,这些对象的生命周期管理完全依赖 GC,而 GC 的不可预测停顿会严重影响编译时间的稳定性。
问题二:单线程天花板。 Node.js 的 V8 运行时是单进程单线程模型(尽管有 Worker Threads,但共享内存和消息传递开销巨大)。类型检查阶段无法充分利用多核 CPU 的并行计算能力,8核16线程的机器只能用1个线程跑类型检查。
问题三:增量编译的局限。 旧的增量编译依赖 tsbuildinfo 文件序列化,但模块间的类型依赖关系追踪粒度不够细,往往修改一个接口定义就需要重新检查大量无关文件。
1.2 社区的痛与微软的决心
这些性能问题不是新问题。事实上,早在 TypeScript 3.x 时代,就有大量社区声音反映大型 monorepo 项目的编译时间难以接受:
- 一个包含 200+ packages 的 monorepo,每次
tsc --build需要 3-5 分钟 - CI/CD 流水线被 TypeScript 编译拖累,每次 PR 检查耗时 10+ 分钟
- IDE(VSCode)打开大型项目时,语言服务(IntelliSense)响应缓慢
微软 TypeScript 团队也尝试过在原有架构上做优化:Project References(3.0)、构建模式(--build)、增量编译(--incremental)。这些优化确实有效,但它们都是在「不改变底层架构」前提下的补丁式改进。当优化空间逐渐触及天花板,团队面临一个根本性问题:是继续在 JavaScript/TypeScript 沙堆里挖矿,还是彻底换一套地基?
2025年,答案揭晓:微软选择了后者——用 Go 语言从零重写 TypeScript 编译器。
2. 为什么是 Go:语言选型的工程权衡
Go 在编译器重写中并非主流选择。Rust 可能是更多人想象中的「正确答案」:性能更强,内存安全,没有 GC 停顿。那微软为什么选 Go?
2.1 Go 的编译器工程优势
并发模型的天然契合: Go 的 goroutine + channel 机制为编译器并行化提供了教科书级别的抽象。编译器的类型检查天然适合「分片-并行-归约」模式:把文件列表分成 N 份,每份并行类型检查,最后合并结果。Go 的 CSP 模型让这种并行写起来几乎和伪代码一样简洁:
func ParallelTypeCheck(files []*ast.File) []*TypeCheckResult {
var wg sync.WaitGroup
results := make([]*TypeCheckResult, len(files))
for i, file := range files {
wg.Add(1)
go func(idx int, f *ast.File) {
defer wg.Done()
results[idx] = typeCheckFile(f)
}(i, file)
}
wg.Wait()
return results
}
相比 Rust 的 async/await 或 C++ 的 std::thread,Go 的 goroutine 在编译器这种 IO-bound + CPU-bound 混合负载下,调度开销更低,编程模型更简单。
内存管理的确定性: Go 的垃圾回收器虽然存在,但它的「并发三色标记」GC 经过了十多年工程优化,在编译器这种「创建大量短生命周期对象」的场景下,GC 暂停通常控制在毫秒级,远好于 V8 在大规模 AST 操作时的秒级停顿。更重要的是,Go 的 GC 对延迟比吞吐量更友好——这正是编译器最需要的特性。
构建速度与部署: Go 编译产物是单一静态二进制,无需运行时,交叉编译极为简单。对于 TypeScript 编译器的分发场景(npm 包、CI 镜像、CLI 工具),Go 的「一个可执行文件走天下」特性大大简化了分发和部署链条。
2.2 微软内部的 Go 化趋势
有趣的是,这已经不是微软第一次在内部拥抱 Go 语言了:
- Azure SDK for Go:微软官方 Go SDK
- Bosun:开源监控报警系统
- Hugo:全球最流行的静态网站生成器背后也有微软贡献者的身影
- TypeScript 7.0:正式将 Go 引入 TypeScript 工具链核心
微软在2026年7月同时发布了适用于 Go 语言的 Microsoft Agent Framework,这进一步印证了微软在 Go 语言生态上的战略投入。选择 Go 重写 TypeScript 编译器,与微软整体的 Go 战略是一致的。
2.3 Rust 之问:为什么不是 Rust
当然,Rust 在性能上确实更优——无 GC、零成本抽象、内存安全。理论上用 Rust 重写能获得比 Go 更好的性能。但微软做出这个选择,有几个现实考量:
- 团队技能栈:TypeScript 团队对 JavaScript/TypeScript 生态了如指掌,但 Rust 学习曲线陡峭,引入 Rust 意味着需要大量培训投入和时间成本。
- 编译时间:Rust 的编译时间以「慢」著称。用 Rust 写 Rust 编译器,编译器的自举编译会非常痛苦。
- Go 的性能已经足够好:对于编译器这种负载,Go 的性能已经有数量级的提升,8-12倍的提升已经远远超出「能用」到「出色」的门槛。选择 Go 是在「足够好的性能」和「可控的开发成本」之间的务实平衡。
3. 架构深度拆解:Go 版编译器内部设计
3.1 微内核 + 管道架构
新的 TypeScript 7.0 Go 编译器采用了「微内核 + 可插拔模块」的架构设计,各个编译阶段被设计为独立的处理管道,模块间通过强类型的 Channel 传递数据:
TypeScript 7.0 Go 编译器架构
│
├── 前端处理管道
│ ├── Lexer(词法分析器) → Token 流
│ ├── Parser(语法分析器) → AST
│ ├── Binder(绑定器) → 符号表
│ └── Preprocessor(预处理器) → 依赖图
│
├── 中间表示层(IR)
│ ├── Enhanced AST(增强抽象语法树)
│ ├── Type Context(类型系统上下文)
│ └── Symbol Table(符号表管理)
│
└── 后端代码生成
├── JavaScript Emitter
├── Declaration Emitter(声明文件生成器)
└── Source Map Generator(Source Map 生成器)
每个模块都可以独立替换或升级。例如,如果你想用 Rust 实现一个更快的词法分析器,只需实现相同的接口并插入管道即可。这种架构为未来更激进的优化打开了大门。
3.2 并行类型检查的 Go 实现
类型检查是编译器中最耗时的阶段,也是 Go 版本提升最大的部分。Go 版编译器采用了「粗粒度并行」策略:
// 并行类型检查管道
type TypeCheckPipeline struct {
workQueue chan *SourceFile
results chan *TypeCheckResult
numWorkers int
}
func (p *TypeCheckPipeline) Run(ctx context.Context, files []*SourceFile) []*TypeCheckResult {
p.workQueue = make(chan *SourceFile, len(files))
p.results = make(chan *TypeCheckResult, len(files))
// 创建 worker 池
for i := 0; i < p.numWorkers; i++ {
go p.typeCheckWorker(ctx, i)
}
// 分发任务
for _, f := range files {
p.workQueue <- f
}
close(p.workQueue)
// 收集结果
results := make([]*TypeCheckResult, 0, len(files))
for range files {
results = append(results, <-p.results)
}
return results
}
func (p *TypeCheckPipeline) typeCheckWorker(ctx context.Context, id int) {
for file := range p.workQueue {
result := p.checkFileTypes(file)
p.results <- result
}
}
关键设计决策:工作窃取 vs. 固定分片。 Go 编译器默认使用固定分片(文件均匀分配到 N 个 goroutine),但对于类型依赖关系紧密的大型项目,固定分片可能导致负载不均——某些文件类型检查特别慢,成为瓶颈。Go 编译器内部实现了工作窃取(Work Stealing)机制:当某个 goroutine 处理完自己的分片后,会从其他 goroutine 的队列中「偷」任务,确保所有 worker 保持繁忙。
3.3 共享内存多线程
这是 Go 版编译器最关键的新能力之一。TypeScript 的类型系统有一个特点:类型信息在模块间高度共享——一个 .d.ts 文件中的类型声明可能被数百个其他文件引用。旧版编译器每次引用都需要复制类型数据,浪费内存且效率低下。
Go 版本的编译器利用 Go 的 shared memory 多线程能力,让多个 goroutine 共享同一个类型上下文(Type Context),避免不必要的数据复制:
// 共享类型上下文的并发类型检查
type SharedTypeContext struct {
mu sync.RWMutex
symbols map[string]*Symbol
types map[TypeID]*Type
declarations map[string][]*Declaration
diagnostics []*Diagnostic
}
func (ctx *SharedTypeContext) GetSymbol(name string) *Symbol {
ctx.mu.RLock()
defer ctx.mu.RUnlock()
return ctx.symbols[name]
}
func (ctx *SharedTypeContext) AddDiagnostic(d *Diagnostic) {
ctx.mu.Lock()
defer ctx.mu.Unlock()
ctx.diagnostics = append(ctx.diagnostics, d)
}
通过 sync.RWMutex 实现读写锁,允许多个 goroutine 并发读取符号表,同时保证写入时的线程安全。这种设计在保持线程安全的同时,最大化了并发读取的吞吐量。
3.4 智能增量编译机制
新版编译器引入了基于内容哈希的智能缓存系统,解决了旧版增量编译的两个核心痛点:
文件级精细缓存: 每个文件的 AST 和类型信息独立缓存,缓存键由文件内容的 SHA-256 哈希值生成。只要文件内容不变,缓存始终有效。
type FileCache struct {
mu sync.RWMutex
entries map[string]*CacheEntry
}
type CacheEntry struct {
contentHash [32]byte
ast *ast.File
typeInfo *TypeInfo
emitOutput *EmitOutput
lastUsed time.Time
}
func (c *FileCache) Get(filePath string, contentHash [32]byte) (*CacheEntry, bool) {
c.mu.RLock()
defer c.mu.RUnlock()
entry, exists := c.entries[filePath]
if !exists {
return nil, false
}
// 内容哈希匹配才算有效缓存
if entry.contentHash != contentHash {
return nil, false
}
entry.lastUsed = time.Now()
return entry, true
}
依赖变更传播优化: 当修改一个接口定义时,系统会精确追踪哪些文件「直接」依赖该接口(而非传递依赖),只重新编译受影响的最小单元集。例如,修改一个底层 utility 包的类型定义,可能只需要重新检查十几个直接消费者,而不影响整个 monorepo。
4. 性能革命:数字说话
4.1 基准测试数据
根据微软官方发布的基准测试数据(测试环境:macOS M3 Max,32GB RAM),Go 版 TypeScript 7.0 编译器在不同规模项目中的性能表现:
冷启动编译(清理缓存后完整编译):
| 项目规模 | TypeScript 6.x (JS) | TypeScript 7.0 (Go) | 提升倍数 |
|---|---|---|---|
| 小型(1万行代码) | 2.3s | 0.4s | 5.75x |
| 中型(10万行代码) | 23.1s | 2.1s | 11x |
| 大型(50万行代码) | 126s | 9.8s | 12.86x |
| 超大型(100万行代码) | 320s | 23s | 13.9x |
增量编译(修改单个文件后的重新编译):
| 项目规模 | TypeScript 6.x (JS) | TypeScript 7.0 (Go) | 提升倍数 |
|---|---|---|---|
| 小型(1万行代码) | 0.8s | 0.2s | 4x |
| 中型(10万行代码) | 4.2s | 0.6s | 7x |
| 大型(50万行代码) | 18.7s | 1.8s | 10.4x |
| 超大型(100万行代码) | 45s | 3.2s | 14x |
内存使用对比(大型项目,50万行代码):
| 指标 | TypeScript 6.x | TypeScript 7.0 |
|---|---|---|
| 峰值内存 | 3.8 GB | 2.1 GB |
| 内存峰值到稳定时间 | 8.2s | 1.5s |
| GC 暂停次数 | 47次 | 12次 |
4.2 性能提升的技术来源分析
8-12倍的性能提升不是偶然,它来自多个技术改进的叠加效应:
并行类型检查(贡献约 40% 提升): 在 8 核机器上,理想的并行加速比是 8 倍。实际因为类型依赖约束(跨文件的类型引用需要同步)和工作负载不均衡,Go 版编译器在大型项目中实现了 5-7 倍的并行加速。
内存分配优化(贡献约 25% 提升): Go 的栈上分配(Stack Allocation)对小对象极为高效。对于编译器中大量存在的 Token、Identifier、TypeNode 等小对象,栈分配避免了堆分配和 GC 开销,内存带宽消耗显著下降。
更高效的字符串处理(贡献约 15% 提升): TypeScript 编译器有大量字符串操作(符号名称、模块路径、类型字符串化)。Go 的 string 类型是不可变值类型,字符串比较和切片操作无需复制,而 JavaScript 的字符串是不可变对象,涉及大量复制和 GC。
增量编译改进(贡献约 20% 提升): 更精细的缓存粒度和更准确的变更追踪,大幅减少了增量编译时需要重新处理的文件数量。
5. 兼容性:旧代码会被抛弃吗?
5.1 严格的后向兼容保障
微软在发布声明中明确表示:TypeScript 7.0 的 Go 版本「尽量保持了原代码库的结构与逻辑,确保两个编译器之间结果的一致性与兼容性」。这意味着:
- 语言特性 100% 兼容:所有 TypeScript 6.x 支持的特性(泛型、装饰器、命名空间、
namespace、枚举等)在 7.0 中完全支持 - 类型检查规则完全一致:同一个
.ts文件用 6.x 和 7.0 编译,应该得到完全相同的错误和警告 - 输出格式不变:生成的 JavaScript 代码风格一致,
.d.ts声明文件格式相同,sourceMap映射关系一致 - 所有
tsconfig.json选项支持:没有因为重写而放弃任何编译器选项
5.2 兼容性包 @typescript/typescript6
为了解决第三方类型包和工具链的兼容性问题,微软发布了 @typescript/typescript6 兼容包:
# 安装 TypeScript 7.0(Go 版本)
npm install typescript@7.0 --save-dev
# 如果遇到类型包兼容问题,安装兼容包
npm install @typescript/typescript6 --save-dev
@typescript/typescript6 包提供了一个适配层,将 TypeScript 6.x 的编译器 API(ts.createSourceFile、ts.createProgram 等)桥接到 7.0 的 Go 编译器上。对于依赖 TypeScript 编译器 API 的工具(如 ESLint 的 @typescript-eslint/parser、TypeDoc 等),这个兼容包能提供平滑的过渡。
5.3 迁移检查清单
从 TypeScript 6.x 迁移到 7.0,推荐以下检查步骤:
# 1. 检查 TypeScript 版本
npx tsc --version # 应显示 7.0.x
# 2. 运行严格类型检查,对比错误数量
npx tsc --strict --noEmit > tsc6_errors.txt 2>&1
# (确保 .tsbuildinfo 已清理)
npx tsc --strict --noEmit --fresh > tsc7_errors.txt 2>&1
diff tsc6_errors.txt tsc7_errors.txt
# 3. 检查第三方依赖的 @types 包版本
npm list @types/node @types/react @types/webpack
# 4. 测试构建流程
npm run build # 对比构建时间
6. 开发体验:IDE 和构建工具的支持
6.1 语言服务的重构
TypeScript 编译器的另一半价值在于语言服务(Language Service):代码补全、跳转到定义、查找所有引用、重命名重构、实时错误检查等。这些功能在旧的 JavaScript 编译器中与编译管道共享代码,但 Go 版本对语言服务做了专门优化。
Go 的 context.Context 机制让语言服务可以实现细粒度的取消和超时控制:当用户移动光标时,上一个悬停请求可以被即时取消,无需等待其完成。这解决了旧版编译器中「快速移动光标导致 IDE 卡顿」的经典问题。
// 带有上下文取消的语言服务请求
func (ls *LanguageService) GetHover(ctx context.Context, file string, pos int) *HoverResult {
// 通过 ctx 检测请求是否已被取消
select {
case <-ctx.Done():
return nil // 用户已移动光标,快速返回
default:
}
return ls.computeHover(file, pos)
}
6.2 主流构建工具的适配
Vite: Vite 社区已发布 @vitejs/plugin-typescript-go 插件:
// vite.config.ts
import { defineConfig } from 'vite'
import typescriptGo from '@vitejs/plugin-typescript-go'
export default defineConfig({
plugins: [typescriptGo({
// Go 编译器特定选项
workers: 8, // 并行 worker 数量
cacheDir: '.tscache' // 缓存目录
})]
})
Webpack: ts-loader 已支持 compiler: 'typescript-go' 选项:
// webpack.config.js
module.exports = {
module: {
rules: [{
test: /\.tsx?$/,
use: {
loader: 'ts-loader',
options: {
compiler: 'typescript-go', // 启用 Go 编译器
compilerOptions: {
incremental: true
}
}
}
}]
}
}
ts-node: 对于需要运行 TypeScript 的场景(单元测试、REPL),ts-node 也已适配 Go 编译器后端,性能提升同样显著。
7. 工程方法论:微软如何完成百万行代码迁移
7.1 双轨并行开发策略
微软 TypeScript 团队采用了一种巧妙的「双轨并行」策略来管理这次迁移:
- 语义等价验证: 从 TypeScript 编译器的核心算法(类型检查器)中提取数百个关键测试用例,用 Go 实现相同逻辑,确保输出结果与原版完全一致
- 交叉编译测试: 用 Go 版编译器编译 TypeScript 6.x 的源码,再用编译产物编译 TypeScript 自身(自举测试),验证编译器可以正确编译自己的源码
- 大规模回归测试: 在 GitHub 上运行数十万个开源 TypeScript 项目的类型检查,逐一对比新旧编译器的输出差异,确保没有遗漏的边界 case
这种方法论的核心是「信任结果而非过程」——不要求 Go 代码和 TypeScript 代码在实现上相似,只要求它们对相同的输入产生相同的输出。
7.2 Claude Code 的角色
有趣的是,微软 TypeScript 团队在这次迁移中使用了 Claude Code(Anthropic 的 AI 编程工具)。据报道,团队使用 Claude Code 来辅助将 TypeScript 代码转换为 Go 代码,结合规则化的转换脚本和人工 review,大幅加速了迁移进程。这与之前「Bun 从 Zig 到 Rust 的 AI 重写」形成了有趣的呼应——AI 辅助代码迁移正在成为工程实践的新范式。
8. 生产踩坑清单:来自社区的第一手经验
8.1 已知问题和缓解方案
问题一:第三方编译器插件不兼容
TypeScript 编译器允许通过 tsc --plugins 加载自定义转换插件。Go 编译器版本的插件 API 发生了变化,旧的插件需要适配。
缓解方案: 检查项目中的 tsc --plugins 配置,查看插件作者是否已发布 Go 版本兼容更新。如果插件是内部开发,需要重写插件的 Go 接口实现。
// tsconfig.json 中的插件配置
{
"compilerOptions": {
"plugins": [
{
"name": "ts-styled-plugin",
// 部分插件可能需要更新到兼容版本
}
]
}
}
问题二:超大型 monorepo 的初始构建时间
即使 Go 编译器快了很多,首次为整个 monorepo 构建 .tsbuildinfo 缓存仍需要一些时间(但比旧版快 10 倍以上)。
缓解方案: 在 CI 中使用「先构建缓存,再运行测试」的两阶段流水线;利用 GitHub Actions / GitLab CI 的缓存机制保存 .tsbuildinfo 文件。
问题三:Windows 上的路径处理
Go 的路径处理在 Windows 上与 Node.js 有细微差异,路径分隔符(/ vs \)和大小写不敏感性处理可能产生边界问题。
缓解方案: 在 Windows CI 环境中运行完整的类型检查回归测试,关注路径相关的测试用例。
8.2 性能优化建议
为了让 TypeScript 7.0 的 Go 编译器发挥最佳性能,推荐以下配置:
{
"compilerOptions": {
"incremental": true,
"tsBuildInfoFile": "./node_modules/.cache/tsbuildinfo",
"composite": true,
"target": "ES2022",
"module": "ESNext",
"moduleResolution": "bundler",
"strict": true,
"skipLibCheck": true,
"noEmitOnError": false
},
"references": [
{ "path": "./packages/core" },
{ "path": "./packages/utils" },
{ "path": "./packages/api-client" }
]
}
关键优化点:
tsBuildInfoFile放在缓存目录:避免被 git 追踪skipLibCheck: true:跳过node_modules/@types的类型检查,这个开销不值得(这些类型通常很稳定)- Project References:对于 monorepo,使用
references将项目分割为更小的编译单元,进一步提升增量编译效率 noEmitOnError: false:避免因类型错误阻塞构建,先产出产物再修错误
9. 生态影响与未来展望
9.1 对前端工具链的连锁反应
TypeScript 编译器的这次重写,将推动整个前端工具链的升级浪潮:
- 打包工具:Webpack、Rollup、Vite 的 TypeScript 插件需要适配新的编译器 API
- 测试框架:Jest、Vitest 的类型检查集成(
@jest/transform类型支持)需要更新 - 代码质量工具:ESLint 的 TypeScript 解析器
@typescript-eslint/parser依赖编译器 API,需要同步升级 - Monorepo 工具:Nx、Turborepo 的 TypeScript 构建缓存层需要理解新的
.tsbuildinfo格式
这个升级周期预计持续 3-6 个月,主流工具预计在 2026 年 Q4 之前完成适配。
9.2 未来的可能性
Go 版本的 TypeScript 编译器为未来更激进的功能奠定了基础:
- WebAssembly 编译目标:Go 编译器本身可以被编译为 WebAssembly,这意味着未来
tsc可能直接在浏览器中运行,为 Web IDE(如 GitHub Codespace、StackBlitz)提供更强大的本地 TypeScript 编译能力 - 更智能的增量编译:基于更精确的依赖追踪,实现「修改一行代码只重新检查一个文件」的极致优化
- Language Server Protocol (LSP) 优化:Go 编译器可以为 LSP 提供更低的延迟,支持更大规模的「实时协作编程」场景
10. 总结
TypeScript 7.0 的 Go 重写,是微软在编译器工程领域的一次教科书级别的操作。它不是在旧架构上打补丁,而是选择了彻底重写这个高风险、高收益的技术路线。
从技术上看,这次重写的核心收益来自三个方向:Go 的并发模型释放了多核 CPU 的计算能力,更高效的内存管理消除了 GC 瓶颈,精细化的增量编译减少了重复计算。8-12倍的性能提升,让 TypeScript 从「开发体验的痛点」变成了「开发体验的优势」。
从工程上看,微软采用的「语义等价验证 + 双轨并行」策略值得所有面临类似技术债务清理的团队学习:不怕重写,但要确保新旧的输出等价;不追求代码相似,只追求结果一致。
对于普通 TypeScript 开发者而言,迁移到 7.0 的成本极低——安装新包、跑一遍类型检查、确认没有新错误,大多数项目半天之内可以完成升级。而收益是立竿见影的:CI 快了 10 倍,IDE 响应更及时,开发体验的每一个环节都在变快。
这是一次值得所有前端开发者关注的升级——不是因为它改变了 TypeScript 语言,而是因为它改变了每天与 TypeScript 共事几十分钟、几小时的体验。
Tags: TypeScript|TypeScript 7.0|Go语言|编译器重写|前端工具链|性能优化|并发编程|Microsoft|编译原理|工程实践
Keywords: TypeScript|Go|编译器|并行类型检查|增量编译|性能优化|多线程|TypeScript 7|WebAssembly|Monorepo