TypeScript 团队发布了TypeScript 4.1,其中包括功能强大的模板字面量类型、映射类型的键重映射以及递归条件类型。
模板字面量类型在社区中得到了非常热烈的响应。这个新特性提供了使用普通字符串字面量类型作为其他类型定义的能力,这让创建和执行模板语法变得很容易。
模板字符串字面量也可以动态生成,并根据模板字符串中的替换位置进行推断。为了进一步支持模板字符串字面量,TypeScript 还添加了新的实用类型别名来修改字母大小写:Uppercase、Lowercase、Capitalize 和 Uncapitalize。
社区提供了很多有趣的模板字符串文本示例,包括 querySelector、路由器参数解析、表达式解析、JSON 解析和序列化、GraphQL 类型的 AST、SQL 查询验证、CSS 解析、游戏、拼写检查,等等。
Haskell 和 PureScript 也有类似的特性,现在 TypeScript 也支持它们了。
TypeScript 4.1 还通过添加键重映射对映射类型进行了改进。映射类型以前仅限于带有已知建的新对象类型,现在支持创建新键或过滤已有的键。
TypeScript 4.1 的另一个重要新增功能是递归条件类型,可以更容易地支持数组或复杂 promise 树的扁平化方法。条件类型现在可以立即在分支中引用自己,从而更容易创建递归类型别名。TypeScript 团队警告说,这个模式应该谨慎使用,避免递归类型检查的速度变慢,而且如果超出了受支持的递归深度,TypeScript 编译器将会抛出编译时错误。
TypeScript 4.1 添加了一个新的编译器标志--noUncheckedIndexedAccess,用来识别潜在未定义属性。这个新特性不会自动包含在--strict 标记中,因为它在一些常见场景中会改变行为,比如遍历 for 循环的索引时。
有两个新的针对 React 17 用户的 JSX 选项,可以更好地支持生产和开发编译,分别是 react-jsx 和 react-jsxdev。
在升级到 TypeScript 4.1 时,需要考虑以下几个重大变更:
内置的 lib.d.ts 自动生成 DOM 类型的行为发生了变化,并移除了 Reflect.enumerateAPI,因为 ES2016 已将其弃用。
类的 abstract 成员不再被标记为 async。调用者只关心返回类型,因此不再存在将 abstract 成员指定为 async 的值。
any 和 unknown 类型现在会在错误的位置传播。
resolve 的参数现在在 promise 中是必需的。TypeScript 4.1 包含了一个快速修复,以简化升级过程。
条件扩展可创建可选属性。
不匹配的参数不再相关。
TypeScript 4.2 的相关工作已经在进行中,预计将于 2021 年 2 月完成。TypeScript 4.2 的内容包括广义索引签名、元组类型中的前/中剩余元素、--noImplicitOverride、--noPropertyAccessFromIndexSignature、静态索引签名、typeof class、更快的编译时迭代,以及编辑器和生产力方面的进一步改进。
TypeScript 采用了 Apache 2 开源许可,欢迎开发者通过TypeScript GitHub项目参与贡献和反馈,并遵循TypeScript贡献指南和微软开源行为准则。
原文链接:
评论