TypeScript 7.0 正式发布

236 阅读11分钟

日期:2026-07-09 主题:TypeScript 7.0 正式发布 原文TypeScript 7.0 正式发布 来源:Microsoft TypeScript Blog 领域:💻 编程语言


背景

2026 年 7 月 8 日,TypeScript 团队正式发布了 TypeScript 7.0。这不是一次普通的版本升级——它是 TypeScript 项目诞生以来最大的一次基础设施变革:将整个编译器从 TypeScript/JavaScript 移植到了 Go,实现了 8 到 12 倍的全量编译加速,并将语言服务协议服务器全面重写为多线程架构。

从 TypeScript 5.x 时代开始,团队就在酝酿这个"原生端口"计划。去年发布的 @typescript/native-preview 预览包累计获得了超过 850 万周下载量,经过长达一年的内部和外部测试,如今终于以 7.0 的版本号正式面世。Daniel Rosenwasser 在公告中这样总结:"欢迎来到 TypeScript 原生工具链的时代。"

核心内容

为什么选 Go 做原生端口?

TypeScript 团队选择 Go 作为原生端口的语言,背后有清晰的技术考量。首先,Go 编译为机器码,没有 JIT 预热开销,启动即全速运行。其次,Go 的 goroutine 和共享内存模型天然适合并行化编译任务——在类型检查这类计算密集型场景中,多核利用率直接影响最终性能。第三,Go 编译为单一二进制文件,跨平台分发极其简单。

端口的执行策略是"尽可能忠实地移植"——保持原有代码的结构和逻辑,确保两个编译器输出的一致性。团队在 Go 中重写了整个代码库,同时保留了原 TypeScript 编译器中的类型检查算法和语义规则。在此基础上,利用 Go 的原生性能和共享内存多线程能力实现量级提升。

性能实测:8–12 倍加速,内存反而更低

TypeScript 7 在真实世界的大型项目上表现惊人。团队公布了一组公开基准测试数据,对比了 TypeScript 6 和 7 在几个知名开源项目上的全量编译时间:

项目TS 6 编译时间TS 7 编译时间加速比
vscode125.7 秒10.6 秒11.9 倍
sentry139.8 秒15.7 秒8.9 倍
bluesky24.3 秒2.8 秒8.7 倍
playwright12.8 秒1.47 秒8.7 倍
tldraw11.2 秒1.46 秒7.7 倍

更令人印象深刻的是,TypeScript 7 在加速的同时还减少了内存占用。团队对比了同一次构建中的内存峰值:

项目TS 6 内存TS 7 内存变化
vscode5.2 GB4.2 GB减少 18%
bluesky1.8 GB1.3 GB减少 26%
sentry4.9 GB4.6 GB减少 6%
playwright1.0 GB0.9 GB减少 11%
tldraw0.6 GB0.5 GB减少 15%

加速的同时内存占用反而下降,这得益于 Go 的内存管理和更紧凑的数据结构。VS Code 的编译峰值从 5.2GB 降到了 4.2GB——这对 CI 环境和内存有限的开发机器来说是实实在在的好处。

编辑器体验的提升更是立竿见影。以 VS Code 自身为例,此前在编辑器中打开一个包含错误的文件,从打开到看到第一个错误提示需要大约 17.5 秒——开发者可以先去倒杯水再回来。在 TypeScript 7 中这一时间缩短到了 1.3 秒以下,超过 13 倍的提升,真正做到了"打开即见"。

并行化架构:--checkers--builders

TypeScript 7 的并行化是多层次的。解析和生成阶段天然可并行,因为文件间依赖较少。但类型检查则复杂得多——文件之间共享类型信息,检查顺序会影响结果的一致性。

为了解决这个问题,TypeScript 7 引入了固定数量的类型检查器 worker。每个 worker 拥有独立的类型视图,它们可能会重复做一些公共计算,但对于相同的输入文件,始终以相同的方式划分工作并产生一致的结果。默认 worker 数量为 4 个,通过 --checkers 参数可以调节。

在更多核的机器上,增加到 8 个 worker 可以进一步发掘硬件潜力:

项目TS 7(4 checkers)TS 7(8 checkers)加速比对比 TS 6
vscode10.6 秒7.51 秒16.7 倍
sentry15.7 秒12.08 秒11.6 倍
bluesky2.8 秒2.01 秒12.1 倍
playwright1.47 秒1.16 秒11.0 倍
tldraw1.46 秒1.06 秒10.6 倍

vscode 在 8 个 checker 下获得了 16.7 倍的加速比,这是大规模并行化带来的边际收益。不过团队也提醒,在 CI 环境等资源受限的场景下,可以设为 --checkers 1 来消除重复计算、降低内存开销。对于调试场景,还提供了 --singleThreaded 标志完全禁用并行化。

全新 --watch 模式

TypeScript 7 的 --watch 模式完全重写,底层使用了 Parcel 打包器的文件监听器——由 Devon Govett 开发的 @parcel/watcher。团队面临一个难题:Parcel 的 watcher 是用 C++ 写的,如果直接依赖它,就需要引入完整的 C++ 工具链来编译,这与 Go 单一二进制分发的理念相悖。

解决方案是:将 C++ 代码移植到 Go,仅保留了少量汇编 shim。这个移植过程从直接的 C++ 到 Go 的直译开始,逐步优化为地道的 Go 代码,同时通过了完整的移植测试套件。新的 watcher 是一个自包含的包,实现了关注点分离,显著降低了 --watch 模式下的资源消耗,尤其在监听大型项目的 node_modules 依赖时更为高效。

配置默认值的大幅变更

TypeScript 7 采用了 TypeScript 6 引入的新默认值(因此团队强烈建议用户先升级到 TS 6,再迁移到 7)。以下是值得关注的变更:

  • strict: true 默认开启——这意味着 noImplicitAny、strictNullChecks 等全部质检开关默认打开
  • module: "esnext" 默认输出 ES Module,不再默认生成 CommonJS
  • target 默认指向当前最新的 ECMAScript 稳定版本
  • noUncheckedSideEffectImports: true 默认检查导入语句是否有实际的类型导出
  • libReplacement: false 关闭内置类型库的自动替换
  • stableTypeOrdering: true 且无法关闭——保证类型排序稳定
  • rootDir: "./" 默认根目录为项目根,源目录如 src/ 需显式指定
  • types: [] 默认不自动加载任何 @types 包——过去 @types/node 等包会自动加载,现在必须手动声明

最后两项变更影响面最广。过去很多项目不设置 rootDir 也能正常工作,现在如果 tsconfig.json 在项目根而源码在 src/ 目录下,需要显式指定 rootDir: "./src"types 字段的变更意味着原来依赖自动类型加载的项目需要手动添加依赖:

{
  "compilerOptions": {
    "types": ["node", "jest"]
  }
}

重大废弃:告别旧时代

以下在 TS 6 中标记废弃的特性在 7.0 中变为硬错误:

  • target: es5 不再支持——ES5 编译目标正式退役
  • module: amd / umd / systemjs / none 不再支持——推荐改用 esnextpreserve
  • moduleResolution: node / node10 / classic 不再支持——推荐改用 bundlernodenext
  • baseUrl 不再支持——paths 改用相对项目根的写法
  • esModuleInteropallowSyntheticDefaultImports 不能设为 false
  • alwaysStrict 始终为 true,不可关闭
  • 命名空间中的 module 关键字不可再用
  • 导入上的 asserts 关键字必须改为 with(与 ECMAScript Import Attributes 语法对齐)

这些变更的方向非常清晰:TypeScript 正在全面拥抱现代 ECMAScript 生态,彻底告别旧的模块系统、编译目标和分辨率策略。对于那些仍然维护着老旧项目、依赖 AMD 模块或 ES5 输出的团队来说,这意味着一项不得不面对的迁移工作。

模板字面量类型:终获 Unicode 码点支持

TypeScript 7 修复了一个长期存在的 Unicode 痛点。以前模板字面量类型在匹配 Unicode 字符时会按 UTF-16 码元拆分,导致 emoji 等非 BMP 字符被错误拆分为两个代理对:

type HeadTail<S> = S extends `${infer Head}${infer Tail}` ? [Head, Tail] : never;
type Result = HeadTail<"😀abc">;
// TS 6: ["\ud83d", "\ude00abc"]    按 UTF-16 码元拆分,返回两个代理对
// TS 7: ["😀", "abc"]               按 Unicode 码点拆分,符合直觉

在 TypeScript 7 中,模板字面量的行为与 for...of[...str] 一致——以 Unicode 码点为单位。这是一个破坏性变更,对于那些刻意模拟 UTF-16 行为(比如实现字符串 Length 工具类型)的代码会产生影响,但在实践中,新行为更加有用且符合直觉。

JavaScript 支持的重构

TypeScript 7 还重新设计了 JavaScript 文件的类型推断机制,使其与 .ts 文件的分析更加一致。过去 TypeScript 对 JS 文件的支持建立在 JSDoc 注释和各种编码模式启发式的基础上,为了兼容 Closure Compiler 和古老的 JSDoc 生态,积累了大量特殊分支和妥协。

这次重构后,主要变化包括:

  • JSDoc 中的 @enum 不再特殊识别,需改用 @typedef
  • @class 不再隐式标记构造函数
  • 后缀 ! 不再支持类型断言——直接用 T 即可
  • Closure 风格的 function(string): void 语法不再支持——改用 TypeScript 风格的 (s: string) => void
  • 类型名称必须定义在 @typedef 标签内

这些变更对主要使用 JS + JSDoc 的项目影响最大。如果团队重度依赖 JSDoc 类型注解,迁移时需要逐一检查。

与 TS 6 的兼容性方案

由于 TypeScript 7 不提供程序化 API(新的 API 将在 7.1 中引入),工具链的适配存在过渡期。为此,团队发布了 @typescript/typescript6 兼容包,提供 tsc6 命令和完整的 TS 6 API 导出。通过 npm 别名机制,可以在一个项目中同时安装两个版本:

{
  "devDependencies": {
    "@typescript/native": "npm:typescript@^7.0.2",
    "typescript": "npm:@typescript/typescript6@^6.0.2"
  }
}

这样配置后,npx tsc 使用 TypeScript 7 进行编译,而 typescript-eslint 等工具仍然通过 peer dependencies 使用 TypeScript 6 的 API。需要注意的是,使用 Vue、MDX、Astro、Svelte 等嵌入式语言的项目暂时只能使用 TS 6——这些框架依赖 Volar 等工具的 API 集成,而 TS 7 暂未暴露稳定 API。团队正在积极跟进,预计在 7.1 中解决。

编辑器体验与生产验证

对于 VS Code 用户,TypeScript 团队提供了一个独立扩展,安装后自动启用 TypeScript 7 语言服务器。Visual Studio 也会根据工作空间自动启用。新的语言服务器基于 LSP 协议,支持多线程并发处理请求。根据团队的遥测数据,相比 TS 6 的语言服务器,新版减少了超过 80% 的语言服务器命令失败率,降低了超过 60% 的服务器崩溃率。

TypeScript 7 经过了大规模的测试验证。内部团队包括 VS Code、Loop、Office、PowerBI、Teams、Xbox,外部合作伙伴包括 Bloomberg、Canva、Figma、Google、Linear、Notion、Sentry、Slack、Vercel、VoidZero 等。

实际用户反馈的数据令人印象深刻:

  • Slack:TypeScript 7 消除了 40% 的合并队列等待时间;CI 类型检查从 7.5 分钟降至 1.25 分钟;此前大型代码库的编辑器近乎"不可用",开发者只能靠 CI 做完整类型检查,现在几秒即可加载,本地类型检查变得切实可行
  • Vanta:最大项目获得 9 倍编译加速
  • Microsoft News Services:每月节省 400 小时的 CI 等待时间
  • Canva:编辑器首次错误提示从 58 秒降至 4.8 秒
  • 微软 PowerBI 团队:在 TS 7 尚不支持 VS Code 重命名功能时就已将其设为默认体验,用团队的原话说是"拯救生命级的改进"
  • 微软 Loop 团队:之前的编辑器体验在 monorepo 规模下"完全不可用",TS 7 的体验被描述为"令人惊叹"

未来路线图

TypeScript 7.0 的发布意味着编译器重写这一重大工程告一段落。团队接下来的工作重点将回归到新功能开发、可用性改进、更多性能优化以及新的 API 设计上。TypeScript 7.1 将在未来 3–4 个月内发布,届时将推出稳定的程序化 API,帮助 Vue、Svelte、Astro 等嵌入式语言框架接入原生加速能力。

总结与展望

TypeScript 7.0 是 TypeScript 项目十二年历史上最重要的版本之一。用 Go 重写编译器带来的 8–12 倍加速不仅仅是数字上的提升——它从根本上改变了开发者的工作流:编辑器响应从"等待"变为"瞬时",CI 从"喝杯咖啡的功夫"变为"数秒完成",内循环反馈速度的提升最终会转化为更高的开发效率和更好的代码质量。

当然,迁移并非没有代价。配置默认值的变更、大量废弃选项的移除、JavaScript JSDoc 支持的重构——这些都意味着团队需要在升级时投入一定的迁移成本。但方向是明确的:TypeScript 正在全面拥抱现代 ECMAScript 标准,对旧时代的模块系统和编译目标做彻底的切割。

欢迎来到 TypeScript 原生工具链的时代。