TypeScript 3.7稳定版发布

TypeScript 3.7 发布了,此版本带来了许多新特性。

Optional Chaining
首先一大亮点是 Optional Chaining,这是社区呼唤特别强烈的一个 ECMAScript 特性。最初它是 TypeScript 的 issue 跟踪器上第 16 个 issue,于 5 年前提交,要知道目前总共有多达 23000 个 issue。
当时 TC39 还没有正式提案,这些年来开发者一直要求实现该特性,但是为了不与 ECMAScript 建议冲突,迟迟没有实现,相反 TS 开发团队一直在帮助推动该提案实现标准化,并最终推及所有 JavaScript 与 TypeScript 开发者。
Optional Chaining 特性主要用于保护出现在属性路径中 null 和 undefined 值,像 C# 等语言中已经有用于访问属性链的语法糖,可以在对象层次结构中的任何地方处理遇到的 null 和 undefined 情况,使它可以正常执行,而不会抛出错误。

具体来讲,在向树状结构深处进行属性值访问时,通常需要检查中间节点是否存在:


var street = user.address && user.address.street;

许多 API 返回一个对象或 null/undefined,并且可能只想在结果不为 null 时从结果中提取属性:


var fooInput = myForm.querySelector('input[name=foo]')
var fooValue = fooInput ? fooInput.value : undefined

Optional Chaining 运算符允许开发人员直接用简单的方式处理这种情况,而不用进行重复性操作,或者使用临时变量分配中间结果:


var street = user.address?.street
var fooValue = myForm.querySelector('input[name=foo]')?.value

因为是保护访问属性链时的 null 与 undefined,所以 Optional Chaining 运算符也叫做“安全导航运算符”,TC39 标准中给出的该运算符是“?.”,它的语法可以适用于三种场景:


obj?.prop // 自判断静态属性访问
obj?.[expr] // 自判断动态访问
func?.(...args) // 自判断函数或方法调用

null 判断合并(Nullish Coalescing)
另一个与 Optional Chaining 很接近的特性是 null 判断合并(Nullish Coalescing),由特定的 Nullish Coalescing 操作符 ?? 启用,它也是即将到来的 ECMAScript 特性。

考虑以下代码:


let x = (foo !== null && foo !== undefined) ?
foo :
bar();

如果 foo 不为空并且不等于 undefined,则执行 bar()。它现在可以等效于:


let x = foo ?? bar();

断言

如果发生意外情况,则有一组特定函数会抛出错误,这被称为断言。例如 Node.js 有一个专用的 assert 函数:


assert(someValue === 42);

如果 someValue 不等于 42,则 assert 将抛出 AssertionError。

JavaScript 中的断言通常用于防止传入不正确的类型,例如:


function multiply(x, y) {
assert(typeof x === "number");
assert(typeof y === "number");

return x * y;
}

不过在 TypeScript 中,会有一些类型问题:


function yell(str) {
assert(typeof str === "string");

return str.toUppercase();
// Oops! We misspelled 'toUpperCase'.
// Would be great if TypeScript still caught this!
}

替代方法是改写代码,以便语言可以对其进行分析,但这不太方便:


function yell(str) {
if (typeof str !== "string") {
throw new TypeError("str should have been a string.")
}
// Error caught!
return str.toUppercase();
}

TypeScript 希望以最小的破坏性方式保留现有 JavaScript 结构,因此 TypeScript 3.7 引入了一个称为“断言签名”的新概念,可以对这些断言函数进行建模。

第一种断言签名对 Node.js assert 的执行方式进行建模,它确保在包含范围的其余部分中,无论检查什么条件都必须为真。


function assert(condition: any, msg?: string): asserts condition {
if (!condition) {
throw new AssertionError(msg)
}
}

assert condition 表示,如果 assert 返回,则传递给 condition 参数的任何内容都必须为 true(否则会引发错误),这意味着对于其余范围,该条件必须是 true。

以前边的 yell 为例,确实可以捕获到类型错误:


function yell(str) {
assert(typeof str === "string");

return str.toUppercase();
// ~~~~~~~~~~~
// error: Property 'toUppercase' does not exist on type 'string'.
// Did you mean 'toUpperCase'?
}

function assert(condition: any, msg?: string): asserts condition {
if (!condition) {
throw new AssertionError(msg)
}
}

另一种断言签名不检查条件,而是告诉 TypeScript 特定的变量或属性具有不同的类型。


function assertIsString(val: any): asserts val is string {
if (typeof val !== "string") {
throw new AssertionError("Not a string!");
}
}

这里的 assert val is string,确保在对 assertIsString 进行任何调用之后,传入的任何变量都将是字符串。


function yell(str: any) {
assertIsString(str);

// Now TypeScript knows that 'str' is a 'string'.

return str.toUppercase();
// ~~~~~~~~~~~
// error: Property 'toUppercase' does not exist on type 'string'.
// Did you mean 'toUpperCase'?
}

这些断言签名与编写类型谓词签名非常相似:


function isString(val: any): val is string {
return typeof val === "string";
}

function yell(str: any) {
if (isString(str)) {
return str.toUppercase();
}
throw "Oops!";
}

类似类型谓词签名,这些断言签名也具有很强的表现力,可以用这些表达一些相当复杂的逻辑:


function assertIsDefined<T>(val: T): asserts val is NonNullable<T> {
if (val === undefined || val === null) {
throw new AssertionError(
`Expected 'val' to be defined, but received ${val}`
);
}
}

此外还有其它新特性与特性增强,详情查看更新说明:
https://devblogs.microsoft.com/typescript/announcing-typescript-3-7

另外,作为更新的一部分,TypeScript 官网还有一个游乐场(Playground)可以体验所有新特性:
https://www.typescriptlang.org/play/index.html?#show-whatisnew

640?wx_fmt=png

推荐阅读

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/313043.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu 16.04 安装 cuda 7.5.run BEGIN failed--compilation aborted at ./cuda-installer.pl line 5

sudo apt install freeglut3-dev build-essential libx11-dev libxmu-dev \ libxi-dev libgl1-mesa-glx libglu1-mesa libglu1-mesa-dev libglfw3-dev libgles2-mesa-dev

.NET手撸绘制TypeScript类图——上篇

.NET手撸绘制TypeScript类图——上篇近年来随着交互界面的精细化&#xff0c; TypeScript越来越流行&#xff0c;前端的设计也越来复杂&#xff0c;而 类图正是用简单的箭头和方块&#xff0c;反映对象与对象之间关系/依赖的好方式。许多工具都能生成 C#类图&#xff0c;有些工…

阅读源码学设计模式-单例模式

有些编码套路是公认的&#xff0c;大家都参照其编写符合可观赏性的代码&#xff0c;那就是设计模式现在.NETcore 默认提供了DI功能&#xff0c;那我想设计一个全局的引擎类&#xff0c;进行注入服务、解析服务、配置中间件。并且要求该引擎类全局唯一&#xff0c;其他地方不能进…

word 中同样的字号和行距倍数,不一样的行距

https://blog.csdn.net/missingu1314/article/details/24430165 http://www.xyduan.net/the-same-single-line-spacing-line-spacing-is-different/ 两篇文档&#xff0c;都是小四号字&#xff0c;都是单倍行距&#xff0c;可是行距明显不同&#xff0c;把其中的一个文档的一…

我终于知道post和get的区别

IT界知名的程序员曾说&#xff1a;对于那些月薪三万以下&#xff0c;自称IT工程师的码农们&#xff0c;其实我们从来没有把他们归为我们IT工程师的队伍。他们虽然总是以IT工程师自居&#xff0c;但只是他们一厢情愿罢了。码农&#xff1a;你知道get和post请求到底有什么区别&am…

【译】使用Blazor构建桌面应用

随着最近.NET Core 3的正式发布&#xff0c;我认为我会尝试一个有趣的小实验。我喜欢使用Electron来创建基于Web的桌面应用程序。我想了解有关Blazor&#xff08;ASP.NET系列的最新成员&#xff09;的更多信息。在这篇文章中&#xff0c;我将向您确切演示如何在15分钟内开始使用…

CAP的学习和应用

前言:用CAP有一段时间了,这里简单记录一下,这么好用的东西,小伙伴们赶紧上车吧一.CAP使用场景?平时工作中经常使用到MQ,如(kafka,rabbitmq...),用来简单的发布/订阅,经常会遇到以下几个问题常用方案,把SQL放前面,MQ放后面,MQ执行失败了,我们把整个SQL进行回滚,这种方案在单应用…

darknet activate_array

void activate_array(float *x, const int n, const ACTIVATION a) { int i; for(i 0; i < n; i){ x[i] activate(x[i], a); } }

[功能发布]Excel催化剂地图可视化功能正式发布,欢迎使用!

地图可视化功能开发完成已过去1个多月&#xff0c;文章的阅读量与初定传播目标相差甚远。但因着热爱分享的缘故&#xff0c;在阅读量未及预期时&#xff0c;仍然破例对其功能进行发布。若真正喜爱Excel催化剂所开发的地图可视化&#xff0c;可通过完成小任务来获取使用资格。再…

WebAssembly生态将完善网络安全性

近日 Mozilla、Fastly、Intel 与 Red Hat 宣布成立联合组织 Bytecode Alliance&#xff08;字节码联盟&#xff09;&#xff0c;该联盟旨在通过协作实施标准和提出新标准&#xff0c;以完善 WebAssembly 在浏览器之外的生态。WebAssembly 也叫 Wasm&#xff0c;它是为基于栈的虚…

/usr/lib/sudo/sudoers.so must be only be writable by owner

https://askubuntu.com/questions/92556/how-do-i-boot-into-a-root-shell 如果你连 sudo su 都无法获取权限&#xff0c;那么只能&#xff1a; 在boot 之后立刻按 Esc or Shift&#xff0c;进入 Ubuntu Recovery Mode 然后 "Enable networking" -> "Dro…

我们终于可以把 bug 留给子孙后代了

“ 阅读本文大概需要 4 分钟。 ”今天在聊项目之前&#xff0c;我们先来聊一下历史。中学时候拿到的第一本历史书&#xff0c;上面是从智人的起源讲起的&#xff0c;他轻轻掠过尧舜禹&#xff0c;秦始皇统一六国&#xff0c;千古一相李斯。他喊二川溶溶&#xff0c;流入宫墙。五…

30分钟无坑部署K8S单Master集群

Jesse导读&#xff1a;11月9号&#xff0c;我在中国.NET开发者峰会&#xff08;.NET Conf China 2019)上分享了之前ASP.NET Core和Kubernetes做微服务的经验&#xff0c;在10号的时候又联合张善友、陈计节两位大佬一起做了一个6个小时的动手实践&#xff0c;得到了非常好的反馈…

pip 安装 imagecodecs 失败

很多类似问题都是需要 pip install --user --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple 再重新安装

亲自实践Blazor构建桌面应用程序

首先是安装.NET Core 3.0 与Node.js.Net Core 版本为&#xff1a;3.0.100Node.js安装版本为&#xff1a;v12.13.0用到的8个命令mkdir blazor-electron-democd blazor-electron-demodotnet new blazorserver --no-httpsdotnet add package ElectronNET.APIdotnet new tool-manif…

CUDA Eclipse Nsight 不能打开工程 an error has occurred see the log file

解决方法&#xff1a; 打开Linux终端&#xff0c;输入命令&#xff1a; echo export PATH/usr/local/cuda-10.0/bin/:$PATH>>~/.bashrc echo export LD_LIBRARY_PATH/usr/local/cuda-10.0/lib64:$LD_LIBRARY_PATH>>/.bashrc source ~/.bashrc

行云万里,转型未来 | 行云创新受邀参加2019中国.NET开发者峰会

2019 年 11 月 9 日&#xff0c;中国 .NET 开发者峰会&#xff08;.NET Conf China 2019&#xff09;在上海拉开帷幕&#xff0c;这是中国 .NET 社区的年度盛会。行云创新受邀参加了此次峰会&#xff0c;为当前最热门的科技专题带来了精彩的演讲&#xff0c;与全国的 .NET 开发…

Ubuntu Anaconda 环境下删除 protobuf

sudo rm -rf /root/anaconda3/bin/protoc //执行文件 sudo rm -rf /root/anaconda3/include/google //头文件 sudo rm -rf /root/anaconda3/lib/libproto* //库文件

西安活动 | 云时代,享未来 .NET 线下沙龙

活动介绍:在云时代到来的今天&#xff0c;越来越多的应用已经依赖于云而构建&#xff0c;这正得益于云给软件开发带来的低成本&#xff0c;易扩展&#xff0c;可重用的便捷之处。.NET Core平台就是为云而诞生的&#xff0c;毫无疑问它是构建云应用的首要之选。已经磨练5年时间&…