写点什么

Typescript 5.4 Beta 发布,提供 Noinfer 工具类型并改善类型推断

  • 2024-03-12
    北京
  • 本文字数:1192 字

    阅读完需:约 4 分钟

大小:426.77K时长:02:25
Typescript 5.4 Beta发布,提供Noinfer工具类型并改善类型推断

最近,TypeScript 的高级项目经理 Daniel Rosenwasser宣布 TypeScript 5.4 beta 版本发布。TypeScript 5.4 改善了类型推断,新增了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) // ~~~~~~~~~~~~ // error! // Property 'searchParams' does not exist on type 'string | URL'.
return url.toString(); });}
复制代码


在上面的代码中,map箭头函数闭包中的url变量必须是 URL 类型。以前版本的 TypeScript 会将url的类型推断为string | URL,就像getUrls函数的签名一样。新发布的 beta 版本能够正确理解箭头函数总是会在 URL 对象最后赋值给url之后创建,因此会将url的类型推断为URL。有些开发人员在 Twitter 上对改进的类型推断表示了欢迎。


如果这些类型范围缩小的变化像看上去这么好的话,那将是一个巨大的改进,这会节省大量不必要的 if 语句、!操作符等。(来源)


闭包中的类型范围缩小很有用,谢谢开发人员。(来源)关于该特性的更多详情,开发人员可以参考发布说明(Preserved Narrowing in Closures Following Last Assignments)。


TypeScript 5.4 还为 JavaScript新的Object.groupByMap.groupBy静态方法添加了声明。发布说明中警告说:


注意,只有将target配置为esnext或调整lib设置后才能访问这些方法。我们希望这些方法最终能够在稳定的es2024目标中使用。除此之外,TypeScript 还为开发人员提供了新的NoInfer工具类型,让他们能够选择不使用 TypeScript 的类型推断。NoInfer允许开发人员阻止有效却不需要使用的类型。在处理泛型类型参数时,该特性尤其有用。


function createStreetLight<C extends string>(colors: C[], defaultColor?: NoInfer<C>) {  // ...}
createStreetLight(["red", "yellow", "green"], "blue");// ~~~~~~// error!// Argument of type '"blue"' is not assignable to parameter of type // '"red" | "yellow" | "green" | undefined'.
复制代码


在前面的样例代码中,TypeScript 5.4 将C指定为可选参数defaultColor的类型,但是,这里没有进一步进行推理,所以最终会将C类型解析为"red" | "yellow" | "green"。以前版本的 TypeScript(没有NoInfer工具类型时)会将C类型推断为"red" | "yellow" | "green" | "blue"


开发人员可以在微软的开发人员博客上查看完整的发布说明,包括新改进的准确性所带来的破坏性变更。该发布说明还包括更多技术细节、样例和该版本特性的完整列表。


开发人员可以按照如下方式安装已发布的 beta 版:


npm install -D typescript@beta


原文链接:

Typescript 5.4 Beta Released with Noinfer Utility Type and Improved Type Inference

2024-03-12 08:004741

评论

发布
暂无评论
发现更多内容

FFmpeg-ffplay播放器分析(1).md

Changing Lin

音视频 ffmpeg 安卓

JavaScript刷LeetCode拿offer-滑动窗口

Geek_07a724

JavaScript LeetCode

TOGAF架构框架3-ADM架构开发技术

Marvin

架构 TOGAF ADM架构开发方法

前端工程师leetcode算法面试必备-二分搜索算法(下)

js2030code

JavaScript LeetCode

发布自己的第一个npm包

格斗家不爱在外太空沉思

npm nodejs 11月月更

Vue基础知识整理【建议收藏】

何极光

Vue 基础

TOGAF企业架构框架4-内容框架

Marvin

架构 TOGAF 企业架构框架 内容框架

如何写成高性能的代码(三):巧用稀疏矩阵节省内存占用

葡萄城技术团队

前端 稀疏矩阵

为什么vue3要选用proxy,好处是什么?

hellocoder2029

JavaScript

一文读懂Js中的this指向

hellocoder2029

JavaScript

云渲染是CG的最后一道工序,四个特性让你的渲染更高效

Finovy Cloud

云渲染 云渲染农场

怎么从容地拿捏时间?来自富兰克林的启示

无人之路

时间管理

决策树-分类树

烧灯续昼2002

机器学习 决策树 sklearn 11月月更

Go语言入门11—接口

良猿

Go golang 后端 11月月更

JavaScript刷LeetCode拿offer-双指针技巧Medium篇

Geek_07a724

JavaScript LeetCode

前端工程师leetcode算法面试必备-二分搜索算法(上)

js2030code

JavaScript LeetCode

透过关键基础设施安全事件谈SBOM

安势信息

Gartner SCA 软件物料清单 SBOM 清源CleanSource SCA

一个非常常见的问题:var、let和const

肥晨

11月月更 js6 js基础

BNBDao三三复制公排dapp系统开发

开发微hkkf5566

使用Vmware创建Centos7虚拟机(安装和配置网络环境、xshell连接、防火墙、yum仓库、磁盘挂载、重启命令)

A-刘晨阳

Linux 运维 vmware 11月月更

深入剖析nodejs中间件

coder2028

node.js

2022年在线招聘求职行业洞察

易观分析

招聘 在线

一比一手写迷你版vue,彻底搞懂vue运行机制

hellocoder2029

JavaScript

融云通信云服务,助力医疗招聘平台构建行业护城河

融云 RongCloud

通信 医疗 融云

前端工程师leetcode算法面试必备-二分搜索算法(中)

js2030code

JavaScript LeetCode

云原生生态 我们选择了哪些

Rayzh

Docker Kubernetes, 云原生, eBPF

Echarts实现全国地图展示

格斗家不爱在外太空沉思

JavaScript eCharts 11月月更

JavaScript刷LeetCode拿offer-双指针技巧

Geek_07a724

JavaScript LeetCode

如何构建并提高自己的核心竞争力?

老张

核心竞争力

云栖大会,一场边缘云计算的「超前瞻」之约

阿里云CloudImagine

云栖大会 边缘云

Linux常用基础命令(巨全)

A-刘晨阳

Linux 运维 11月月更 基础命令

Typescript 5.4 Beta发布,提供Noinfer工具类型并改善类型推断_大前端_Bruno Couriol_InfoQ精选文章