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 6 | TypeScript 7 | 加速倍数 | 内存 |
|---|---|---|---|---|
| VS Code | 125.7 秒 | 10.6 秒 | 11.9 倍 | 5.2 GB 降至 4.2 GB |
| Sentry | 139.8 秒 | 15.7 秒 | 8.9 倍 | 4.9 GB 降至 4.6 GB |
| Bluesky | 24.3 秒 | 2.8 秒 | 8.7 倍 | 1.8 GB 降至 1.3 GB |
| Playwright | 12.8 秒 | 1.47 秒 | 8.7 倍 | 1.0 GB 降至 0.9 GB |
| tldraw | 11.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 没有设置的选项才会受影响:
| 选项 | 新的默认值 | 如果你依赖旧默认值,会有什么影响 |
|---|---|---|
strict | true | 从未设置 strict 的项目,现在会启用严格空值检查、noImplicitAny 以及其他严格检查 |
target | es2025,即 esnext 之前的最新版本 | 除非设置更旧的 target,否则输出会保留现代语法 |
module | esnext | 除非设置 nodenext 或 commonjs,否则输出 ES 模块 |
types | [] | 已安装的 @types 包不再自动加载:需要添加 "types": ["node"](["*"] 可恢复旧行为) |
rootDir | ./,即 tsconfig.json 所在的文件夹 | 如果设置了 outDir 且源码在 src 中,会报 error TS5011,直到你设置 "rootDir": "./src" |
noUncheckedSideEffectImports | true | 像 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
- 先升级到 TypeScript 6(如果你还在用 5.x):
npm install --save-dev typescript@6。修复它报告的每一个弃用错误,而不是用"ignoreDeprecations": "6.0"让它们静默。 - 在 TypeScript 6 下开启
"stableTypeOrdering": true,并修复它带来的所有变化。团队表示,这样的配置在 7 中会得到完全相同的编译结果。 - 显式设置默认值已改变的选项,如果你依赖旧的默认值,例如
"types": ["node"]和"rootDir": "./src"。 - 安装 TypeScript 7:
npm install --save-dev typescript@latest。之后可以视情况删除stableTypeOrdering,它在 7 中始终开启。 - 检查你的工具链。 如果你使用 typescript-eslint、ts-node 或带模板类型检查的框架,请按上文设置 TypeScript 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。