TypeScript 4.8 正式发布


TypeScript 4.8 已正式发布。

自 Beta 和 RC 发布以来的变化

自 Beta 测试版发布以来,稳定版现已支持从自动导入中排除特定文件。测试版的公告没有提到围绕类型签名中未使用的解构别名 (destructuring aliases) 的破坏性变化。此外,Beta 和 RC 发布公告都没有介绍关于在 TypeScript 语法树装饰器的 API 破坏性变化。这些内容在新版发布公告中进行了详细说明。

主要变化

  • 改进交叉类型、联合类型兼容性,以及类型收窄功能
  • 改进对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-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-08-15

TypeScript 4.8 首个 RC 已发布。开发团队表示,从现在开始到发布 TypeScript 4.8 稳定版本,预计除了修复重要错误之外不会有进一步的变化。 主要更新内容包括: 改进交叉类型、联合类型兼容性,以及类型收窄功能 改进对infer

2023-03-07

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

2024-04-11

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

2023-08-04

WGCLOUD 是一款集成度较高的分布式运维监控平台,具有集群监控,易部署、易上手使用、轻量、高效、自动化等特点,server 端基于 springboot 开发,agent 端使用 go 编写。核心模块包括:主机系统信息监控,CPU 监控,CPU 温

2023-09-16

多元共进|2023 Google 开发者大会精彩演讲回顾 WGCLOUD 是一款集成度较高的分布式运维监控平台,具有集群监控,易部署、易上手使用、轻量、高效、自动化等特点,server 端基于 springboot 开发,agent 端使用 go 编写。核心

2023-09-08

Google 开发者在线课程 开始学习 人人站 CMSv1.4.8已经正式上线,本次更新增加了新插件与部分文章功能,具体更新内容如下: 1、[新增]文章内容分页展示功能 2、[修复]模板文件编辑可以打开代码文件的bug 3、[修复]后台添加管

2022-11-30

导出 #20203 / #20204 [FEATURE] 预览类型:更新到 Typescript 4.8 更新说明:https://github.com/emberjs/ember.js/releases/tag/v4.9.0

2022-10-01

提升性能 优化 module 下载 UI 改进开发者体验 升级 TypeScript 至 4.8 CacheWeb API 此版本添加了对CacheAPI 的支持。该 API 可用于缓存 Request/Response 对象,对于动态生成 response 的场景十分有帮助。它允许缓存 GET 请求的

2023-06-30

OpenCV 是 Intel 开源计算机视觉库,它实现了图像处理和计算机视觉方面的很多通用算法。OpenCV 4.8 版本的主要更新内容如下: DNN module patches: #23161、#23409 TFLite 模型支持,包括 int8 量化模型。 #23604 启用 DNN 模

2022-12-03

lowInlineMediaPlayback 属性 ( #10014 ) ( 4a0e1c9 ) TypeScript 4.8+ 支持和 NativeClass decorator 改进 ( #10081 ) ( 7f069a7 ) Performance Improvements core: android sdk 检查(#10084)(abd722c) Breaking Changes utils/utils is

2022-09-27

列的emphasis.scale添加缺少的 type number#17390 [Fix]:确保与 [email protected] 的兼容性 #17582 [Fix] [svg]:生成 SVG 字符串时对 HTML 特殊字符进行编码。#17406 [Fix] [visualMap]: 修复鼠标悬停在地图标签上时指示器不显示的问题。#17346 [Fix]

2022-09-23

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