✅ TypeScript 发布 5.7 次版本升级,支持最新的 ES2024!

2,366 阅读4分钟

00-ts.png

作者:TS 团队

译者:林语冰

资源:TS 官方博客[1]

免责声明:活人翻译,略有删改,仅供粉丝参考!

00. 导读

TS 团队官宣 5.7 次版本正式升级,主要包含以下新特性:

01-ts.png

01. 支持 ES2024

TS 5.7 支持 --target es2024,允许运行时 target 为 ES2024,新增指定 --lib es2024,ES2024 新特性包括:

  1. Promise.withResolvers
  2. Object.groupByMap.groupBy
  3. ArrayBufferSharedArrayBuffer

⛔ 请注意,SharedArrayBufferArrayBuffer 现在略有不同。为了保留底层缓冲区类型,Uint8Array 等所有 TypedArrays 现在也是泛型。

02-es2024.png

现在,每个 TypedArray 都包含一个 TArrayBuffer 默认类型参数,是故我们可以继续引用 Int32Array,无需显式写为 Int32Array<ArrayBufferLike>

02. 检查变量初始化

一直以来,如果在之前的分支区块中变量没有初始化,TS 会报错。

03-error.png

不幸的是,这种智能分析有时会失效。🤣

举个栗子,如果在单独的函数中访问变量,类型系统不知道什么时候会调用函数,那就只能“乐观”检查,假设变量会被初始化。

04-work.png

当变量没有初始化时,TS 5.7 的类型系统现在会报错。👍

05-assign.png

03. 重写相对路径

tsx、Deno 和 Bun 等都支持就地运行 TS,无需构建生成 JS 输出文件。

最近,Node 也在尝试支持实验性的 --experimental-strip-types--experimental-transform-types,这让我们不必担忧重新运行构建任务。

为了尽量兼容这些工具,就地导入的 TS 文件在运行时导入 必须 使用恰当的 TS 扩展名。

举个栗子,如果要导入 foo.ts 的文件,在 Node 中必须这样写:

06-tsx.png

以前这样写 TS 通常还会报错,因为 TS 期望我们导入输出文件。有些工具确实允许 .ts 导入,所以之前 TS 通过一个 --allowImportingTsExtensions 选项支持这种导入风格。

这行得通,但是如果需要从这些 .ts 文件中生成 .js 文件,那会怎样呢?这是库作者的需求,他们只需要分发 .js 文件,但目前 TS 一直避免重写任何路径。

为此,我们新增了一个 --rewriteRelativeImportExtensions 编译器选项。当导入是 ./ 等相对路径且为 .tsx 等 TS 后缀的非声明文件,编译器会将路径重写为对应的 .jsx 等 JS 扩展名。

07-rewrite.png

这允许 TS 代码就地运行,然后在准备就绪时编译为 JS。

TS 避免重写路径主要是因为动态导入,在任何依赖中没法覆写 import 的行为。

08-import.png

⛔ 另一个问题在于 TS 只会重写相对路径,不会重写任何依赖 baseUrlpaths 的路径:

09-base.png

10-util.png

⛔ 任何可能通过 package.jsonexportsimports 字段解析的路径也不会重写。

11-imports.png

12-space.png

因此,如果你在使用多包相互引用的 workspace 风格布局,那你可能需要使用具有作用域自定义条件的 条件导出[2]:

13-dev.png

每当要导入 .ts 文件时,你都可以使用 node --conditions=@xx/development 来运行它。

⛔ 请注意用于 @xx/development 条件的 “namespace” 或 “scope”。这是一个临时解决方案,用来避免与可能也使用 development 条件的依赖冲突。如果每个人都在其模块中发布了 development,那可能会解析为无效的 .ts 文件。

04. 检查 JSON 导入

--module nodenext 下的 .json 文件导入时,TS 现在会要求包含 type: “json”import 属性。

21-json.png

在这种验证之上,TS 不会生成“命名”导出,并且 JSON 导入的内容只能通过默认值访问。

22-type.png

05. 支持 V8 编译缓存

Node 22 新增一个 module.enableCompileCache() API[3],允许运行时复用在首次运行工具后完成的某些解析和编译工作。

TS 5.7 利用了这个 API,运行 tsc --version 的速度大约提高了 2.5 倍。

粉丝互动 😍

👉 本期的话题是:如何评价 TS 5.7 的新特性,你期待未来可以支持哪些新特性

欢迎你在本文下方留言互动,或者友情转发。👻

我是大家的林语冰 👨‍💻,欢迎持续关注我,随时了解前端社区的最新资讯。

谢谢大家的点赞和转发,我们下期再见,掰掰~ 👍

参考文献

[1] TS 官方博客: devblogs.microsoft.com/typescript/…

[2] 条件导出: nodejs.org/api/package…

[3] module.enableCompileCache() API: github.com/nodejs/node…