TypeScript 7.1 Beta:ambient 模块终于能声明 import attributes,还顺手把 target 推到 es2026
7.1 Beta 有六节内容:ambient 模块的 import attributes、source phase imports、--target es2026、新库方法、7.1 的 API(快照 / 文件系统 / content mappers)与若干行为变更。
TypeScript 7.1 Beta 在 10 月 20 日发布,npm install -D typescript@beta 就能试。这是 7.0 之后第一个功能版本,官方博客列了六节,我按「会不会影响我的项目」重排了一遍。
ambient 模块里的 import attributes
主标题是这条。import attributes 是挂在 import 语句上的元数据:
import myData from "./data/someData.json" with { type: "json" };
import readme from "../README.md" with { type: "text" };
import photo from "./myPhoto.png" with { type: "bytes" };
浏览器和运行时没法靠扩展名猜怎么处理一个导入,所以 type 成了事实标准:json 走 JSON 解析,text 返回字符串,bytes 返回 Uint8Array,css 返回 CSSStyleSheet(可以塞进 document.adoptedStyleSheets)。
问题在于声明文件那一侧。过去要支持 import "./x.css",你得写一条通配的 ambient 声明:
// 以前:只能声明模块形状,没法声明「带什么 attribute 才算合法」
declare module "*.css";
7.1 让 ambient 模块声明可以带 attributes 约束,于是「*.css 必须配 type: "css"」这种事终于能表达出来。对写库的人意义更大 —— 以前类型层面无法拒绝一个错误的 with 子句。

source phase imports 与 –target es2026
import source x from "./mod.wasm" 这种「只拿模块源码、不实例化」的写法进了 beta。它的用途是把模块当资源传递(比如给 Worker 或 WebAssembly.compile)。
--target es2026 则是把编译目标推到下一年的语言版本。我的经验是:target 只该跟着运行时走,不该跟着年份走。如果你的运行环境是 Node 26 或 Chrome 156,用 es2026 没问题;如果还要照顾旧浏览器,多出来的语法降级会让产物变复杂。

7.1 的 API:三块
这节是给工具作者看的,也是我觉得 7.1 最实质的部分:
- Snapshots:编译器状态的快照接口,让语言服务能在不重跑全量分析的前提下拿到一致视图。
- File System APIs:把文件系统访问抽象成可替换的实现 —— 内存文件系统、虚拟文件系统、远程文件系统都能挂进来。
- Content Mappers:内容映射层,用来把「源文件」与「编译器看到的内容」解耦(比如注入虚拟文件、改写内容)。
三块加起来指向同一件事:让 TypeScript 更容易被嵌进别的工具。过去想在 TS 之上做一个自定义语言服务,只能 fork 或者拼补丁;现在有官方接口。
行为变更两条
- lib.d.ts 调整:每次动 lib 都可能让「本来能编过的代码」报错。升级前先跑一遍
tsc --noEmit。 - 分布式类型参数上的更强检查:条件类型里对 distributive type parameters 的检查更严了。这类收紧通常会在泛型工具库里冒出一批新错误,而且报错位置往往离真正的写法很远。

现在要不要试
我的建议:在自己的库或工具上试,业务项目等正式版。理由很具体 —— 7.1 的价值集中在 API 那一节,而 API 的消费者是工具作者;普通项目能拿到的只有 --target es2026 和新库方法,收益有限,而 lib.d.ts 与类型检查收紧带来的修错成本是实打实的。
真要试的话,先做一件事:把 tsc --noEmit 的输出和 7.0 逐条对比。行为变更的影响面只能靠跑出来,不能靠读 release notes 推断。

评论
…