作者:
TS 团队
译者:
林语冰
资源:TS 官方博客[1]
免责声明:活人翻译,略有删改,仅供粉丝参考!
00. 导读
TS 团队官宣 5.7 次版本正式升级,主要包含以下新特性:
01. 支持 ES2024
TS 5.7 支持 --target es2024
,允许运行时 target
为 ES2024,新增指定 --lib es2024
,ES2024 新特性包括:
Promise.withResolvers
Object.groupBy
和Map.groupBy
ArrayBuffer
和SharedArrayBuffer
⛔ 请注意,SharedArrayBuffer
和 ArrayBuffer
现在略有不同。为了保留底层缓冲区类型,Uint8Array
等所有 TypedArrays
现在也是泛型。
现在,每个 TypedArray
都包含一个 TArrayBuffer
默认类型参数,是故我们可以继续引用 Int32Array
,无需显式写为 Int32Array<ArrayBufferLike>
。
02. 检查变量初始化
一直以来,如果在之前的分支区块中变量没有初始化,TS 会报错。
不幸的是,这种智能分析有时会失效。🤣
举个栗子,如果在单独的函数中访问变量,类型系统不知道什么时候会调用函数,那就只能“乐观”检查,假设变量会被初始化。
当变量没有初始化时,TS 5.7 的类型系统现在会报错。👍
03. 重写相对路径
tsx、Deno 和 Bun 等都支持就地运行 TS,无需构建生成 JS 输出文件。
最近,Node 也在尝试支持实验性的 --experimental-strip-types
和 --experimental-transform-types
,这让我们不必担忧重新运行构建任务。
为了尽量兼容这些工具,就地导入的 TS 文件在运行时导入 必须 使用恰当的 TS 扩展名。
举个栗子,如果要导入 foo.ts
的文件,在 Node 中必须这样写:
以前这样写 TS 通常还会报错,因为 TS 期望我们导入输出文件。有些工具确实允许 .ts
导入,所以之前 TS 通过一个 --allowImportingTsExtensions
选项支持这种导入风格。
这行得通,但是如果需要从这些 .ts
文件中生成 .js
文件,那会怎样呢?这是库作者的需求,他们只需要分发 .js
文件,但目前 TS 一直避免重写任何路径。
为此,我们新增了一个 --rewriteRelativeImportExtensions
编译器选项。当导入是 ./
等相对路径且为 .tsx
等 TS 后缀的非声明文件,编译器会将路径重写为对应的 .jsx
等 JS 扩展名。
这允许 TS 代码就地运行,然后在准备就绪时编译为 JS。
TS 避免重写路径主要是因为动态导入,在任何依赖中没法覆写 import
的行为。
⛔ 另一个问题在于 TS 只会重写相对路径,不会重写任何依赖 baseUrl
和 paths
的路径:
⛔ 任何可能通过 package.json
的 exports
和 imports
字段解析的路径也不会重写。
因此,如果你在使用多包相互引用的 workspace 风格布局,那你可能需要使用具有作用域自定义条件的 条件导出[2]:
每当要导入 .ts
文件时,你都可以使用 node --conditions=@xx/development
来运行它。
⛔ 请注意用于 @xx/development
条件的 “namespace” 或 “scope”。这是一个临时解决方案,用来避免与可能也使用 development
条件的依赖冲突。如果每个人都在其模块中发布了 development
,那可能会解析为无效的 .ts
文件。
04. 检查 JSON 导入
从 --module nodenext
下的 .json
文件导入时,TS 现在会要求包含 type: “json”
的 import
属性。
在这种验证之上,TS 不会生成“命名”导出,并且 JSON 导入的内容只能通过默认值访问。
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…