TypeScript 7.1 测试版发布公告

TypeScript 7.1 测试版发布公告

💡 原文英文,约4300词,阅读约需16分钟。
📝

内容提要

TypeScript 7.1 测试版发布,主要更新包括:环境模块声明支持导入属性(如 type: "css"、"text"、"bytes"),可按属性匹配类型并报错;新增 source 阶段导入,支持 WebAssembly 模块;新增 es2026 目标及多项库方法;推出全新模块化 API,含同步/异步客户端、快照与虚拟文件系统;引入内容映射器,为 Vue、Svelte 等单文件组件提供一等支持;并大幅优化性能与内存,部分项目提速近两倍、内存减半。

🔎

延伸解读

导入属性声明:让类型检查跟上运行时语义

过去用通配符环境模块声明(如 *.css)只能按扩展名推断类型,无法区分同一扩展名在不同导入属性下的行为。7.1 允许在 declare module 中附加 with { type: "css" | "text" | "bytes" },导入时缺少属性会报错,类型也随属性变化。需注意这类声明不校验磁盘文件是否存在,且官方不建议库作者随包发布,应由终端项目自行声明以避免与内置库冲突。

source 阶段导入:目前真正落地的是 WebAssembly

import source 返回的是模块被解析但尚未加载依赖、未执行代码时的对象,类型为 AbstractModuleSource,可用于 Map/Set 并保持引用同一性。文章明确指出,当前对 JavaScript 文件做 source 导入用处有限,许多环境尚不支持;实际可用场景主要是把 .wasm 的 source 导入直接交给 WebAssembly.instantiate。使用它需要 --module 为 esnext、nodenext 或 preserve,并配合相应的 lib/target 设置。

新 API 与内容映射器:工具链集成方式的变化

7.1 的 API 拆分为 typescript/sync、async、fs、ast 等入口,并引入快照与分层虚拟文件系统,便于增量建模文件变化。API 与 Program、Snapshot 都是可释放对象,需用 using 或显式 dispose,否则可能在 Go 侧泄漏。内容映射器则让 Vue、Svelte、Astro 等单文件组件成为一等支持,但命令行需加 --runExternalCode,编辑器需工作区信任与授权,属于需要留意的安全边界。

升级前应关注的行为变化与性能数据

性能方面,官方基准显示部分项目提速接近两倍、内存最多减半,但不同代码库差异明显,例如 bluesky 与 vscode 仅约 1.2 倍,不能一概而论。行为上,分布式类型参数的条件类型检查更严格,原先依赖宽松约束的代码可能报错,需要调整约束或增加条件检查;lib.d.ts 的 DOM 类型更新也可能影响现有类型检查。建议升级时预留处理新错误的余量。

❓

Q&A

TypeScript 7.1 测试版在环境模块声明中支持导入属性有什么作用?

环境模块声明现在可以按导入属性(如 type: "css"、"text"、"bytes")匹配类型,并在导入时缺少所需属性时报错,同时根据属性返回正确的类型。这解决了仅靠文件扩展名无法区分运行时行为的问题,并避免了为相同属性重复声明多个扩展名模式。

TypeScript 7.1 的 source 阶段导入是什么?能用来做什么?

source 阶段导入是 ECMAScript 提案中的新特性,使用 import source 语法获取模块解析后的对象(AbstractModuleSource),但尚未加载依赖或执行代码。对于 WebAssembly 模块,该对象是 WebAssembly.Module,可直接传给 WebAssembly.instantiate 进行实例化。目前 JavaScript 文件的 source 导入用途有限,且需要适当的 --module 和 --lib/--target 设置。

TypeScript 7.1 新增的 es2026 目标包含哪些库方法?

es2026 目标稳定了多项 ECMAScript 2026 特性,包括 Math.sumPrecise()、Iterator.concat()、JSON.rawJSON()、JSON.parse() 重载、Error.isError()、Map/WeakMap 的 getOrInsert() 和 getOrInsertComputed()、Uint8Array 的 toBase64/setFromBase64/toHex/setFromHex 及静态 fromHex/fromBase64、Array.fromAsync() 等。

TypeScript 7.1 的新模块化 API 包含哪些入口点?

新 API 分为多个入口点:typescript/sync(同步编译器客户端)、typescript/async(基于 Promise 的异步客户端)、typescript/fs(请求作用域的文件系统)、typescript/ast(AST 节点类型和枚举)、typescript/ast/is(节点类型守卫)、typescript/ast/factory(创建和更新节点的函数)。这些入口点支持构建工具和实用程序。

TypeScript 7.1 的内容映射器如何支持 Vue、Svelte 等单文件组件?

内容映射器是新的插件点,可针对特定文件扩展名注册,为 TypeScript 生成文件的虚拟表示,并将嵌入的 JavaScript/TypeScript 区域映射回原文件,从而提供准确的错误信息和工具支持。使用时需在 tsconfig.json 的 contentMappers 中配置包和扩展名,命令行需加 --runExternalCode 标志,编辑器(如 VS Code)需工作区信任和权限。已支持 Astro、CSS Modules、Ember、MDX、Svelte、Vue 等。

TypeScript 7.1 在性能优化方面有哪些实际提升?

根据测试(4 个类型检查线程,--noEmit),部分项目构建速度提升近 2 倍(如 mui-docs 从 22.2s 降至 11.9s,提速 1.9x),内存减少最高达 49.6%(mui-docs 从 8093 MiB 降至 4079 MiB)。其他项目如 sentry、t3code-server、vscode 也有 1.2x 到 1.4x 的提速和 15% 到 25% 的内存降低。

TypeScript 7.1 对分布式类型参数的条件类型检查有什么变化?

TypeScript 7.1 加强了检查:在分布式条件类型中,每个分支里的类型参数被视为原参数的一个子类型,不再与其他约束到原参数的类型产生关系。这可能导致之前能通过的代码报错,例如在 false 分支中使用 Show<A, B> 会提示 B 不满足约束 A。需要修改代码,如移除不必要的约束或添加额外条件检查。

🏷️

标签

➡️

继续阅读