TypeScript 5.4 Beta 发布,引入 Noinfer 实用类型和改进的类型推断

TypeScript 5.4 Beta 发布总结

TypeScript 的高级项目经理 Daniel Rosenwasser 近日宣布了 TypeScript 5.4 的 Beta 版本发布。该版本带来了类型推断的改进、新的 NoInfer 工具类型以及一些破坏性变更。

改进的类型推断

TypeScript 5.4 Beta 在闭包中对某些类型的类型推断进行了改进。例如,在以下代码中:

function getUrls(url: string | URL, names: string[]) {
  if (typeof url === "string") {
    url = new URL(url);
  }

  return names.map(name => {
    url.searchParams.set("name", name)
    return url.toString();
  });
}

map 的箭头函数的闭包中,url 变量的类型必然是 URL。之前的 TypeScript 版本会根据 getUrls 函数的签名将 url 推断为 string | URL。而此次发布的 Beta 版本正确地理解到箭头函数总是在 url 最后一次被赋值为 URL 对象之后创建,因此将 url 推断为 URL 类型。

开发者对这一改进表示欢迎,认为这将减少不必要的 if 语句和 ! 操作符的使用。

新增 Object.groupByMap.groupBy 声明

TypeScript 5.4 还添加了对 JavaScript 新静态方法 Object.groupByMap.groupBy 的声明。需要注意的是,这些方法仅在配置 targetesnext 或调整 lib 设置时可用,预计未来将在 es2024 目标下稳定可用。

新的 NoInfer 工具类型

TypeScript 5.4 引入了新的 NoInfer 工具类型,允许开发者阻止 TypeScript 的类型推断。这在处理泛型类型参数时特别有用。例如:

function createStreetLight<C extends string>(colors: C[], defaultColor?: NoInfer<C>) {
  // ...
}

createStreetLight(["red", "yellow", "green"], "blue");

在此代码示例中,TypeScript 5.4 将 C 类型解析为 "red" | "yellow" | "green",而之前的版本则会将 C 推断为 "red" | "yellow" | "green" | "blue"

破坏性变更

TypeScript 5.4 还包含由于改进的准确性而导致的破坏性变更。开发者可以在 Microsoft 的开发者博客上查看完整的发布说明,包括技术细节、示例和所有新功能的列表。

安装 Beta 版本

开发者可以通过以下命令安装发布的 Beta 版本:

npm install -D typescript@beta

此次 TypeScript 5.4 Beta 版本的发布带来了多项重要改进和新功能,特别是类型推断的增强和新的 NoInfer 工具类型,预计将为开发者提供更强大的工具和更高效的开发体验。

阅读 22
0 条评论