Menu

TypeScript 7:原生编译器、主要变化与升级指南

TypeScript 7 是用 Go 重写、以原生程序形式发布的 TypeScript 编译器:速度大约快十倍,命令仍是 tsc,语言也完全相同。本文介绍对使用者有哪些变化(新的默认值、被移除的选项、缺失的 JavaScript API)、哪些工具仍需要 TypeScript 6,以及如何升级。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

TypeScript 7 是用 Go 重写、以原生程序形式发布的 TypeScript 编译器。语言没变,命令仍然是 tsc,npm 包也仍然是 typescript;变化在于速度(完整构建大约快十倍)、一组新的默认值,以及移除了 TypeScript 6 已弃用的选项。TypeScript 7.0 于 2026年7月8日发布,npm 上的版本是 7.0.2。

npm install --save-dev typescript@latest
npx tsc --version
Version 7.0.2

在类型层面能看到的少数差异之一,是模板字面量类型如何拆分字符串。JavaScript 以 UTF-16 码元存储字符串,像 😀 这样的 emoji 要占两个码元:

TypeScript 6 按码元拆分模板字面量类型,就像 text[0] 那样。TypeScript 7 按码点拆分,就像 [...text] 那样,所以 emoji 保持完整:

type HeadTail<S> = S extends `${infer Head}${infer Tail}` ? [Head, Tail] : never;

type Result = HeadTail<"😀abc">;
// TypeScript 7: ["😀", "abc"]
// TypeScript 6: ["\ud83d", "\ude00abc"]

TypeScript 为什么用 Go 重写

直到 6 版本,TypeScript 编译器本身都是用 TypeScript 编写、运行在 Node.js 上的。在大型代码库中,这意味着构建慢、编辑器启动慢、内存占用高。

Anders Hejlsberg 在 2025年3月11日发布了一篇题为 “A 10x Faster TypeScript” 的文章,宣布了原生移植计划。新代码库的代号是 Corsa,原来的 JavaScript 代码库代号是 Strada。团队移植的是现有编译器的代码,而不是重新设计类型检查器,所以新编译器遵循同样的规则,报告同样的错误。TypeScript 6.0(2026年3月)是 JavaScript 代码库的最后一个版本,起到了过渡作用:它弃用了 TypeScript 7 将要移除的所有内容。TypeScript 7.0 随后于 2026年7月8日发布。

TypeScript 7 快了多少

以下是 7.0 发布时公布的开源项目完整构建数据:

项目TypeScript 6TypeScript 7加速倍数内存
VS Code125.7 秒10.6 秒11.9 倍5.2 GB 降至 4.2 GB
Sentry139.8 秒15.7 秒8.9 倍4.9 GB 降至 4.6 GB
Bluesky24.3 秒2.8 秒8.7 倍1.8 GB 降至 1.3 GB
Playwright12.8 秒1.47 秒8.7 倍1.0 GB 降至 0.9 GB
tldraw11.2 秒1.46 秒7.7 倍0.6 GB 降至 0.5 GB

这些测试使用的是默认的 4 个类型检查工作线程。在同一台机器上使用 --checkers 8,VS Code 的构建耗时 7.51 秒(16.7 倍),tldraw 耗时 1.06 秒(10.6 倍),代价是占用更多内存。

编辑器的提升同样明显。语言服务现在以原生语言服务器的形式运行:在 VS Code 代码库中,从打开编辑器到看到文件中第一个错误的时间,从大约 17.5 秒缩短到 1.3 秒以内。对于 monorepo、CI 流水线以及打开大型代码库的编辑器,这种提速最有意义。

哪些保持不变

  • 命令和包。 npm install --save-dev typescript 和 npx tsc。安装时,npm 会从 @typescript/typescript-linux-x64 这样的可选依赖中为你的平台选择一个预编译二进制文件,所以不需要额外配置。
  • 语言。 同样的语法,同样的类型系统,同样的错误代码。
  • 结果。 发布说明指出,几乎所有在 TypeScript 6.0 下开启 stableTypeOrdering 标志、不设置任何 ignoreDeprecations 且编译无误的代码,在 TypeScript 7.0 中都应当得到完全相同的编译结果。

新的默认值

TypeScript 6.0 修改了这些默认值,TypeScript 7 沿用了它们。只有你的 tsconfig.json 没有设置的选项才会受影响:

选项新的默认值如果你依赖旧默认值,会有什么影响
stricttrue从未设置 strict 的项目,现在会启用严格空值检查、noImplicitAny 以及其他严格检查
targetes2025,即 esnext 之前的最新版本除非设置更旧的 target,否则输出会保留现代语法
moduleesnext除非设置 nodenext 或 commonjs,否则输出 ES 模块
types[]已安装的 @types 包不再自动加载:需要添加 "types": ["node"](["*"] 可恢复旧行为)
rootDir./,即 tsconfig.json 所在的文件夹如果设置了 outDir 且源码在 src 中,会报 error TS5011,直到你设置 "rootDir": "./src"
noUncheckedSideEffectImportstrue像 import "./styles.css" 这样的副作用导入需要一个模块声明(declare module "*.css";),框架的类型包通常会提供
stableTypeOrdering始终开启,无法关闭每次运行时类型的排序都相同,所以错误消息和 .d.ts 输出不再依赖检查顺序

被移除的选项和语法

TypeScript 6 中弃用的选项,在 TypeScript 7 中都会报错:

  • target: es5,以及只为 ES5 输出而存在的 downlevelIteration。
  • moduleResolution: node(也叫 node10)和 classic。请改用 nodenext 或 bundler。
  • module: amd、umd、system 和 none。
  • baseUrl(把 paths 写成相对于 tsconfig 文件的路径)和 outFile(改用打包工具)。
  • esModuleInterop: false、allowSyntheticDefaultImports: false 和 alwaysStrict: false;这三项始终开启。

编译器会明确告诉你该删除什么:

error TS5102: Option 'baseUrl' has been removed. Please remove it from your configuration.
error TS5108: Option 'moduleResolution=node10' has been removed. Please remove it from your configuration.

两种旧语法也会报错:用 module Foo { } 声明命名空间(改写为 namespace Foo { };为包声明的 declare module "foo" 不受影响),以及导入断言(assert { type: "json" } 改为 with { type: "json" })。

index.ts(2,8): error TS1540: A 'namespace' declaration should not be declared using the 'module' keyword. Please use the 'namespace' keyword instead.

把第 2 行的 module 改成 namespace 就能修复,程序会输出 4。

在命令行中,如果文件夹里有 tsconfig.json,tsc file.ts 现在会以 error TS5112 停止,而不是悄悄忽略配置。可以只运行 tsc,或者加上 --ignoreConfig。对于用 JSDoc 检查的 JavaScript 文件,TypeScript 7 读取类型的方式更接近 TypeScript 本身:不再识别 @enum,把值当作类型使用时需要加 typeof。tsconfig 页面 列出了每个被移除选项的替代方案。

仍需要 TypeScript 6 的工具

TypeScript 7.0 没有提供稳定的 JavaScript API。require("typescript") 只返回版本信息(version 和 versionMajorMinor),其他工具要调用的编译器函数(createProgram、语言服务)都不存在;包里的 typescript/unstable/* 入口是实验性的,不能作为替代。发布说明称,团队预计 TypeScript 7.1 会提供一套全新的、不同的 API。在那之前,凡是把编译器当作库导入的工具,都要继续使用 TypeScript 6:

  • typescript-eslint(需要类型信息的 lint 规则)
  • Vue、Svelte 和 Astro 文件的语言工具、Angular 的模板类型检查,以及 MDX
  • ts-node,安装了 TypeScript 7 时它会在启动时崩溃

为此,TypeScript 提供了一个兼容包 @typescript/typescript6,它会安装带有完整 API 的 TypeScript 6 和一个 tsc6 命令。借助 npm 别名,一个项目可以同时拥有两者:TypeScript 7 负责构建,导入 typescript 的工具得到的是 6 版本。

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

运行 npm install 之后:

$ npx tsc --version
Version 7.0.2
$ npx tsc6 --version
Version 6.0.3

如果你没有使用上面这些工具,直接安装普通的 typescript,跳过这一步即可。

新的命令行选项

原生编译器会并行地解析、检查和生成代码。有三个新标志用来控制并行,发布说明把 --checkers 和 --builders 标为实验性功能:

标志作用
--checkers N每个项目的类型检查工作线程数(默认 4)。在多核机器上调高可能有帮助,但会占用更多内存;调低适合小型 CI 机器。
--builders N用 --build 构建项目引用时,同时构建的项目数。它和 --checkers 相乘:4 个 builder 配 4 个 checker,最多可同时运行 16 个检查线程。
--singleThreaded关闭所有并行,用于调试或内存受限的环境。

--watch 也被重写了,基于 Parcel 打包工具中文件监听器的 Go 移植版。

编辑器支持

对于 VS Code,TypeScript 团队发布了专门的 TypeScript 7 扩展;安装后它会成为默认选项,在命令面板中执行 “Disable TypeScript 7 Language Server” 可以切换回 TypeScript 6。最新版 Visual Studio 会根据工作区自动启用 TypeScript 7,其他编辑器(Neovim、Zed、Sublime Text、Emacs)则通过语言服务器协议(LSP)连接它。使用 Vue、Svelte、Astro 或 MDX 文件,或者使用 Angular 模板的项目,在 TypeScript 7 提供这些工具可用的 API 之前,编辑器支持仍基于 TypeScript 6。Angular 项目仍然可以用 TypeScript 7 的 tsc 快速检查整个项目。

如何升级到 TypeScript 7

  1. 先升级到 TypeScript 6(如果你还在用 5.x):npm install --save-dev typescript@6。修复它报告的每一个弃用错误,而不是用 "ignoreDeprecations": "6.0" 让它们静默。
  2. 在 TypeScript 6 下开启 "stableTypeOrdering": true,并修复它带来的所有变化。团队表示,这样的配置在 7 中会得到完全相同的编译结果。
  3. 显式设置默认值已改变的选项,如果你依赖旧的默认值,例如 "types": ["node"] 和 "rootDir": "./src"。
  4. 安装 TypeScript 7: npm install --save-dev typescript@latest。之后可以视情况删除 stableTypeOrdering,它在 7 中始终开启。
  5. 检查你的工具链。 如果你使用 typescript-eslint、ts-node 或带模板类型检查的框架,请按上文设置 TypeScript 6 别名。
  6. 确认版本:运行 npx tsc --version,并确保 CI 从更新后的锁文件安装依赖。

tsgo 与预览版

在正式发布之前,原生编译器以 @typescript/native-preview 的形式发布,命令是 tsgo,这样可以和 JavaScript 版的 tsc 并存试用。2025年和2026年初的文章提到的都是 tsgo。到了 7.0,这个名字已经不再日常使用:原生编译器就是 tsc,它的每日构建版本以 typescript@next 发布(目前是 7.1 的开发版本)。

常见问题

TypeScript 7 是什么?

TypeScript 7 是 TypeScript 编译器用 Go 重写、编译为原生程序后的第一个版本,不再以 JavaScript 的形式运行在 Node.js 上。它检查的是同一门语言,使用的是同一个 tsc 命令,发布说明称完整构建通常比 TypeScript 6 快 8 到 12 倍。它于 2026年7月8日发布。

TypeScript 7 是用 Go 写的吗?

是的。编译器和语言服务都从 TypeScript 移植到了 Go(这个项目的代号是 Corsa,原来的 JavaScript 代码库代号是 Strada)。你仍然通过 npm 安装 typescript 包;npm 会为你的操作系统和 CPU 选择一个预编译好的原生二进制文件。

升级到 TypeScript 7 需要修改代码吗?

通常不用改代码,有时需要改配置。TypeScript 7 移除了 6.0 已弃用的选项(target: es5、moduleResolution: node、baseUrl、outFile 等),并修改了 strict: true 和 types: [] 等默认值。在 TypeScript 6.0 下开启 stableTypeOrdering、不设置 ignoreDeprecations 且编译无误的代码,在 7 中应当得到完全相同的编译结果。

tsgo 是什么?

tsgo 是原生编译器预览版的命令名,在 7.0 发布之前以 npm 包 @typescript/native-preview 的形式发布。在 TypeScript 7 中,原生编译器就是 typescript 包里的 tsc,每日构建版本则来自 typescript@next。

typescript-eslint 能和 TypeScript 7 一起用吗?

不能直接使用。TypeScript 7.0 没有提供稳定的 JavaScript API,而 typescript-eslint、ts-node 以及 Vue、Svelte 和 Angular 的模板检查器都要调用这个 API。可以通过 @typescript/typescript6 包(一个 npm 别名)为它们保留 TypeScript 6,构建时则使用 TypeScript 7 的 tsc。TypeScript 团队预计 TypeScript 7.1 会提供一套全新的、不同的 API。

Coddy 编程语言插图

和 Coddy 一起学编程

开始