TypeScript 4.8 RC 发布


TypeScript 4.8 首个 RC 已发布。开发团队表示,从现在开始到发布 TypeScript 4.8 稳定版本,预计除了修复重要错误之外不会有进一步的变化。

主要更新内容包括:

  • 改进交叉类型、联合类型兼容性,以及类型收窄功能
  • 改进对infer模板字符串类型中的类型推理
  • 增强--build,--watch--incremental性能
  • 优化比较对象和数组字面量时的错误提示
  • 改进绑定类型中的类型推导
  • 修复文件监视功能(尤其是跨 git checkout的场景)
  • 增强 Find-All-References 性能
  • 从自动导入中排除特定文件
  • 正确性修复和兼容性变化

交叉类型与联合类型的类型收窄增强

TypeScript 4.8 版本对--strictNullChecks进行了进一步增强,主要体现在联合类型与交叉类型,以及类型收窄地表现上。

举例来说,作为 TypeScript 类型系统中的 Top Type ,unknown 类型包含所有的其他类型,实际上 unknown 和{} | null | undefined的效果是一致的:独特意义的 null、undefined 类型,加上万物起源的{}

模板字符串类型中的 infer 提取

在 4.7 版本中 TypeScript 支持了 infer extends 语法,使得我们可以直接一步就 infer 到预期类型的值,而不需要再次进行条件语句判断:

type FirstString<T> =
T extends [infer S, ...unknown[]]
? S extends string ? S : never
: never;
​
// 基于 infer extends
type FirstString<T> =
T extends [infer S extends string, ...unknown[]]
? S
: never;

4.8 版本在此基础上进行了进一步地增强,当 infer 被约束为一个原始类型,那么它现在会尽可能将 infer 的类型信息推导到字面量类型的级别:

// 此前为 number,现在为 '100'
type SomeNum = "100" extends `${infer U extends number}` ? U : never;
​
// 此前为 boolean,现在为 'true'
type SomeBool = "true" extends `${infer U extends boolean}` ? U : never;

同时,TypeScript 会检查提取出的值能否重新映射回初始的字符串,如 SomeNum 中会检查String(Number("100"))是否等于"100",在下面这个例子中就是因为无法重新映射回去,而导致只能推导到 number 类型:

// String(Number("1.0")) → "1",≠ "1.0"
type JustNumber = "1.0" extends `${infer T extends number}` ? T : never; 

绑定类型中的类型推导

TypeScript 中的泛型填充也会受到其调用方的影响,如以下示例:

declare function chooseRandomly<T>(x: T,): T;
​
const res1 = chooseRandomly(["linbudu", 599, false]);

此时 res1 的类型与函数的泛型 T 会被推导为Array<string | number | boolean>,但如果我们换一个方法:

declare function chooseRandomly<T>(x: T,): T;
​
const [a, b, c] = chooseRandomly(["linbudu", 599, false]);

此时 a、b、c 被推导为了 string、number、boolean 类型,也就是说此时函数的泛型被填充为[string, number, boolean]这么个元组类型。

这一泛型填充方式被称为绑定模式(Binding Pattern),而在 4.8 版本中,禁用了基于绑定模式的类型推导,因为其对泛型的影响并不始终正确:

declare function f<T>(x?: T): T;
​
const [x, y, z] = f();

详情查看发布公告。


相關推薦

2022-08-27

TypeScript 4.8 已正式发布。 自 Beta 和 RC 发布以来的变化 自 Beta 测试版发布以来,稳定版现已支持从自动导入中排除特定文件。测试版的公告没有提到围绕类型签名中未使用的解构别名 (destructuring aliases) 的破坏性变化。此外

2022-10-27

调的错误 特性 Ember.js 4.8 引入了 1 个特性: 作为 TypeScript Adoption Plan(TypeScript 采用计划)的一部分,带来了对 TypeScript 支持的预览。 Ember CLI 4.8 的变化 错误修复 Ember CLI 4.8 引入了 4 个错误修复: 确保新安装的附加

2022-06-24

TypeScript 4.8 首个 Beta 版本已发布。 可以通过 NuGet 获取它,或者使用 npm 和以下命令: npm install -D typescript@beta 还可以通过以下方式获得编辑器支持 下载 Visual Studio 2022/2019 遵循 Visual Studio Code 的说明。 以下

2022-09-15

NET 7 RC 1 发布了, .NET 7 将有两个支持生产的候选版本 (RC), 这是第一个。 下载 .NET 7 Release Candidate 1 .NET 7 RC 1 中的新增功能: 支持在 Windows Server 2019 上默认使用 ICU 库 Windows Server 2019 缺乏 ICU 支持。在 Windows Server 2019 上运

2023-03-03

TypeScript 5.0 发布首个 RC 版本,从现在开始到 TypeScript 5.0 的稳定版本,除了关键的错误修复之外不会有进一步的变化。 5.0 版本实现了新的装饰器标准、更好地支持 Node 和捆绑器中的 ESM 项目的功能、库作者控制泛型推理的新方

2022-05-13

TypeScript 4.7 首个 RC 版本已发布。该版本主要新功能如下: Node.js 中的 ECMAScript 模块支持 模块检测控制 计算属性的控制流分析 改进的对象和方法中的函数推理 实例化表达式 extendsinfer 类型变量的约束 类型参数的可选

2023-03-07

Ember.js 4.11 引入了 2 个特性 为@ember/owner包提供稳定的 TypeScript 类型(首次在 4.10 发布) 为@ember/error包提供稳定的 TypeScript 类型 这两个包都已经有了作为公共预览类型一部分的类型,这些是第一个从 Ember 自己的 TypeScript

2022-11-03

TypeScript 4.9 RC 已发布,自  Beta 版本以来,新增了 return  关键字 go-to-definition 、在类中包含自动访问器等新功能,点击链接即可查看对于功能的详情。 TypeScript 4.9  Beta 版本值得关注的新特性: 新增 satisfies 操作符

2023-11-05

TypeScript 5.3 RC 版本现已发布。可以通过 NuGet 获取,或通过 npm 使用以下命令获取: npm install -D typescript@rc TypeScript 5.3 中的新特性包括: Import Attributes 在 Import Types 中稳定支持resolution-mode resolution-mode在所有模块模式均受

2023-08-11

TypeScript 5.2 发布了首个 RC 版本。 5.2 新特性 using 声明和显式资源管理 (using Declarations and Explicit Resource Management) 装饰器元数据 (Decorator Metadata) 命名和匿名元组元素 (Named and Anonymous Tuple Elements) 为数组并集 (U

2024-04-11

Gitee OpenAPI v5 SDK for Typescript v5.4.83 发布。 以下是本次更新内容: 新增 获取存储库指定发行版的附件清单接口 新增 存储库指定发行版附件上传接口 新增 获取/删除存储库下指定发行版附件接口 新增 指定存储库发行版附

2022-09-23

前言 本期主要对日志性能、远程请求性能还有诸多模块性能进行改进。 项目信息 Gitee:https://gitee.com/dotnetchina/Furion Github:https://github.com/MonkSoul/Furion 文档:https://dotnetchina.gitee.io/furion 本期更新 v4.4.8 版本细

2023-06-03

TypeScript 5.1 已正式发布。 重要变化 更智能地检查未定义返回值的函数 (undefined-Returning Functions) 旧代码 function foo() { // no return } // x = undefined let x = foo(); //fine - we inferred that 'f1' returns 'void' function f1() { // no returns } //fine -

2021-11-18

11月17日,微软发布了 TypeScript 4.5 正式版本 ,4.5 正式版本和 RC 版本在功能上并没有什么改动,除了添加关于新 JSDoc 特性的注释 ,不过这个特性也是 RC 版本的新功能,只是当时没有写出来。 TypeScript 4.5 正式版新