发布 TypeScript 5.4 RC

发布 TypeScript 5.4 RC

💡 原文英文,约3200词,阅读约需12分钟。
📝

内容提要

TypeScript 5.4 RC发布,新增功能包括闭包中的保留缩小、NoInfer实用类型、Object.groupBy和Map.groupBy方法、require()调用支持等。TypeScript 5.5将把5.0中的弃用功能变为硬错误。值得注意的行为变化包括改进的类型检查、类型变量与基本类型的交集减少、对带插值的模板字符串的更好检查。此外,还有枚举可赋值性限制和枚举成员名称限制的变化。

🔎

延伸解读

闭包中的保留缩小:更智能的类型推断

TypeScript 5.4 改进了闭包中的类型缩小,当参数或 let 变量在非提升函数中使用时,类型检查器会查找最后一次赋值点,从而在闭包外安全地缩小类型。这解决了以往因变量可能被修改而无法在回调中保留缩小的痛点,使常见 JavaScript 模式更易表达。但需注意,如果变量在嵌套函数中被赋值,缩小分析将失效,因为无法确定函数调用时机。

NoInfer 实用类型:控制类型推断

新增的 NoInfer<T> 实用类型允许开发者阻止 TypeScript 从特定位置推断类型参数,从而避免不期望的类型推断结果。例如,在 createStreetLight 函数中,使用 NoInfer 包装 defaultColor 参数的类型,可以确保 defaultColor 只能从 colors 数组推断,拒绝不在数组中的值。这提供了一种更简洁的替代方案,无需额外类型参数。

枚举可赋值性与成员名称限制

TypeScript 5.4 收紧了枚举的可赋值性规则:当两个枚举具有相同声明名称和成员名称时,如果值已知,则要求值必须相同才兼容。此外,枚举成员名称现在禁止使用 Infinity、-Infinity 和 NaN。这些变化可能影响现有代码,升级时需检查枚举定义,确保兼容性。

升级注意事项:弃用与行为变化

TypeScript 5.4 是最后一个支持 5.0 中弃用选项(如 target: ES3、noImplicitUseStrict 等)的版本,这些选项将在 5.5 中变为硬错误。此外,lib.d.ts 更新、条件类型约束更准确、模板字符串插值检查改进等行为变化可能导致现有代码出现新错误。建议在升级前仔细测试,并参考官方迁移指南。

❓

Q&A

TypeScript 5.4 RC 有哪些主要新功能?

TypeScript 5.4 RC 的主要新功能包括:闭包中的保留缩小、NoInfer 实用类型、Object.groupBy 和 Map.groupBy 方法、在 --moduleResolution bundler 和 --module preserve 下支持 require() 调用、导入属性和断言的检查、添加缺失参数的快速修复等。

TypeScript 5.4 中的 NoInfer 类型有什么作用?

NoInfer<T> 实用类型用于阻止 TypeScript 在类型推断时探索内部类型作为候选,从而避免推断出不符合预期的类型。例如,在 createStreetLight 函数中,使用 NoInfer 可以确保 defaultColor 参数只能使用 colors 数组中存在的颜色。

TypeScript 5.4 对枚举做了哪些限制?

TypeScript 5.4 引入了新的枚举可赋值性限制:当两个枚举具有相同的声明名称和成员名称时,如果值已知,则要求值必须相同才兼容;此外,枚举成员名称不能使用 Infinity、-Infinity 或 NaN。

TypeScript 5.4 中闭包内的类型缩小是如何改进的?

TypeScript 5.4 改进了闭包中的类型缩小:当参数和 let 变量在非提升函数中使用时,类型检查器会查找最后一次赋值点,如果找到,就可以安全地从包含函数外部进行缩小。但如果在嵌套函数中有任何赋值,则不会进行这种分析。

TypeScript 5.4 中 Object.groupBy 和 Map.groupBy 方法如何使用?

Object.groupBy 接受一个可迭代对象和一个分组函数,返回一个对象,其键是分组键,值是对应元素的数组。Map.groupBy 类似,但返回一个 Map。这些方法需要将 target 设置为 esnext 或调整 lib 设置才能使用。

TypeScript 5.4 在模块解析方面有什么新支持?

TypeScript 5.4 允许在 --moduleResolution bundler 和 --module preserve 下使用 require() 调用。当设置 --module preserve 时,会隐式设置 --moduleResolution 为 bundler,并启用 --esModuleInterop 和 --resolveJsonModule。

TypeScript 5.4 有哪些值得注意的行为变化?

值得注意的行为变化包括:lib.d.ts 的更新、更准确的条件类型约束、更积极地减少类型变量与基本类型的交集、改进对带插值的模板字符串的检查、类型导入与本地值冲突时报错、枚举可赋值性限制、枚举成员名称限制、更好地保留带有 any 的元组的映射类型等。

TypeScript 5.5 计划将哪些弃用功能变为硬错误?

TypeScript 5.5 将把 TypeScript 5.0 中弃用的选项和行为变为硬错误,包括 target: ES3、noImplicitUseStrict、keyofStringsOnly、suppressExcessPropertyErrors、suppressImplicitAnyIndexErrors、noStrictGenericChecks、charset、out、prepend in project references 等。使用这些功能的代码需要迁移。

🏷️

标签

➡️

继续阅读