TypeScript 7 用 Go 重写了,速度比上一代快10倍

更新日期: 2025-12-05 阅读: 481 标签: TypeScript

TypeScript 官方团队发布了一篇新文章,宣布用 Go 语言重写的 TypeScript v7 现在可以供开发者尝鲜了。

简单来说,这次重写的核心目标就一个:解决大型项目里 TypeScript 越来越慢的问题。

你可能早就感觉到了,当项目变得越来越大,代码保存后要等好几秒,编辑器才能反应过来;有时想跳转到某个类型定义,界面也会卡住。这次重写就是为了告别这些烦人的等待。


TypeScript 的速度瓶颈

TypeScript 在 2012 年由微软发布,它的核心使命就是给 JavaScript 加上“静态类型检查”。简单说,就是让你在写代码时就能发现类型相关的错误,而不是等到运行时才崩溃。

TypeScript 编译器本身最早是用 JavaScript 写的,后来团队用它实现了“自举”——也就是用 TypeScript 来写 TypeScript 编译器。但无论怎么优化,它的底层实现和执行环境始终是 JavaScript(Node.js),这从根本上限制了它的性能。

随着现代前端应用越来越复杂,问题也越来越突出:

  • 编译速度慢:稍微大点的项目,做一次类型检查动不动就要几十秒。

  • 内存占用高:Node.js 是单线程的,处理海量类型信息时力不从心,内存消耗巨大。

  • 编辑器卡顿:基于旧引擎的代码补全、跳转定义等功能,反应越来越迟钝。


为什么选择 Go 语言?

为了解决这些根本性的问题,TypeScript 团队启动了一个代号为 “Project Corsa” 的原生移植计划,并用 Go 语言来完成重写。

选择 Go 语言的理由很明确:

  1. 原生性能:Go 代码直接编译成机器码执行,比在 JavaScript 虚拟机里运行快得多。

  2. 内存高效:拥有更好的内存管理能力,占用更低。

  3. 并发能力强:天生就能方便地利用多核 CPU 进行并行计算,这对分析海量代码非常有利。

根据团队公布的早期测试,在某些大型代码库(比如 VS Code 的代码)上,新的 TypeScript 7 编译速度可以达到 6.0 版本的 10 倍左右。这个提升,足以改变开发体验。


现在能用了吗?怎么用?

答案是:可以用,而且已经相当好用了。

如果你想在编辑器里体验,最快的方法是安装 VS Code 扩展。

  1. 在 VS Code 扩展商店里搜索 “TypeScript Native Preview”。

  2. 安装后,在编写 TypeScript 文件时,状态栏会出现一个火箭图标,点击它即可切换到新的原生编译服务。
    这个预览扩展功能很完整,每天更新,支持代码补全、跳转定义、查找引用、重命名、错误提示等几乎所有核心功能。

如果你想在命令行或构建脚本里使用,也可以通过 npm 安装。

# 安装新编译器
npm install -D @typescript/native-preview
# 使用方式与 tsc 类似
tsgo -b tsconfig.json

这个新的 tsgo 命令兼容大部分 tsc 的编译选项。最关键的是,它的类型检查准确性非常高。官方表示,在超过 2 万个测试用例中,新版本的行为与 TypeScript 6.0 的表现几乎一致。


重要变化与迁移提醒

TypeScript 7 是原生版本,自然也会清理一些旧版本中过时的功能。你需要为项目做些调整:

变化项说明迁移建议
--strict此模式现在默认开启检查配置,移除不必要的 strict: true 设置
--target默认将指向最新的 ES 标准(如 es2025)明确指定你需要的目标版本
--baseUrl移除了此选项使用路径映射(paths)来配置模块解析
--moduleResolution node10此旧解析模式被移除改用 bundler 或 nodenext 等现代模式

为了帮助你迁移,官方推荐使用社区工具 @andrewbranch/ts5to6 来升级配置。

npx @andrewbranch/ts5to6 --fixBaseUrl tsconfig.json
npx @andrewbranch/ts5to6 --fixRootDir tsconfig.json


已知的限制

当然,目前这还是预览版,并非所有功能都已完成。

  • 降级编译:将代码编译为旧版本 JavaScript(降级)目前只支持到 ES2021。

  • 监听模式:--watch 模式的效率可能暂时还不如旧版。

  • api 不兼容:新的原生版本没有实现旧版的完整编译器 API,这可能会影响一些深度集成 TypeScript 的构建工具或 Lint 工具。

如果你的项目依赖这些尚未完善的功能,可以暂时采用“双包共存”的策略:同时安装 typescript(稳定版)和 @typescript/native-preview(预览版),在需要的时候切换使用。


未来的方向

官方已经明确表示:TypeScript 6.0 将是最后一个基于 JavaScript 实现的主要版本

6.0 版本会作为一个“过渡版本”,主要任务是逐步废弃那些将在 7.0 中被彻底移除的功能。之后不会有 6.1,只有必要的补丁更新。这意味着,TypeScript 的未来已经完全押注在这次 Go 语言重写的 7.0 版本上了。


总结

TypeScript 用 Go 重写,是近年来整个前端工具链趋势的一个缩影。我们正处在一个“底层工具性能革命”的浪潮中:

  • babel 被用 Rust 写的 SWC 取代,速度提升数倍。

  • webpack 面临用 Rust 写的 RspackFarm 等新打包器的挑战。

  • ESLint 和 Prettier 也有了 OxlintBiome 等高性能的 Rust 替代品。

这些新工具的目标都一样:用高性能的系统级编程语言(Rust、Go、Zig)来重写那些对性能敏感的 JavaScript 工具,从而让开发者的体验更快、更流畅,能更专注于创造而不是等待。

因此,TypeScript 7 不仅仅是一个更快的编译器,它代表了整个前端工程体系向着更高性能和更佳体验的一次重要迈进。

本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!

链接: https://fly63.com/article/detial/13286

相关推荐

Nerv_一款类 React 前端框架,基于虚拟 DOM 技术的 JavaScript(TypeScript) 库

Nerv_是一款由京东凹凸实验室打造的类 React 前端框架,基于虚拟 DOM 技术的 JavaScript(TypeScript) 库。它基于React标准,提供了与 React 16 一致的使用方式与 API。

使用TypeScript两年后-值得吗?

差不多两年前,我在一个创业团队中开始了一个全新的项目。用到的全都是类似Microservices,docker,react,redux这些时髦的东西。我在前端技术方面积累了一些类似的经验

TypeScript最佳实践:是否使用noImplicitAny

我应该使用noImplicitAny TypeScript编译器标志吗?noImplicitAny编译器选项所做的,基本上是将TypeScript从可选类型语言转换为强制类型检验语言。这使得TypeScript离JavaScript的超集稍微远了一些,因为简单的:

为什么要学习Typescript 语言呢?Typescript 开发环境安装

TypeScript是一种由微软开发的自由和开源的编程语言。它是JavaScript的一个超集,TypeScript是JavaScript类型的超集,它可以编译成纯JavaScript。TypeScript可以在任何浏览器、任何计算机和任何操作系统上运行,并且是开源的。

5分钟了解TypeScript

有两种方式安装TypeScript,如何创建第一个TypeScript文件,在TypeScript中,可以使用interface来描述一个对象有firstName和lastName两个属性,TypeScript支持JavaScript的新功能,其中很重要的一个功能就是基于类的面向对象编程

Typescript中以变量方式传递类

最近尝试用TypeScript写一个工具库,需要实现这样一个场景:声明一个抽象类Parent,声明一组子类ChildA、ChildB继承这个Parent,实现它的抽象方法

TypeScript_TS系列之高级类型

交叉类型:将多个类型合并为一个类型、联合类型:表示取值可以为多种类型中的一种、混合类型:一个例子就是,一个对象可以同时做为函数和对象使用,并带有额外的属性、类型断言:可以用来手动指定一个值的类型

用TypeScript弥补Elm和JavaScript之间的差距

近些日子,我使用了新语言编程,从JavaScript,切确地说是Elm,转成TypeScript。在本文中,我将继续深挖一些我非常喜欢的TypeScript特性。

TypeScript_命名空间(namespace)

什么时候要用命名空间?如果你发现自己写的功能(函数/类/接口等...)越来越多, 你想对他们进行分组管理就可以用命名空间, 下面先用类,举例:发现namespace下还有export, export在这里用来表示哪些功能是可以外部访问的:

TypeScript功能:const断言

我发现官方的 TypeScript 文档非常有用,但是总觉得有点过于学术化并且枯燥无味。每当我发现一个新功能时,我想要知道这个功能究竟能够解决什么问题而不是长篇大论

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!