

TypeScript 利用 `never` 配合 `switch`穷举目标类型
source link: https://wayou.github.io/2021/09/10/TypeScript_%E5%88%A9%E7%94%A8__never__%E9%85%8D%E5%90%88__switch_%E7%A9%B7%E4%B8%BE%E7%9B%AE%E6%A0%87%E7%B1%BB%E5%9E%8B/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

TypeScript 利用 `never` 配合 `switch`穷举目标类型
2021 9 月 10 日
TypeScript 利用 never
配合 switch
穷举目标类型
never
类型可赋值给任意类型,反之不然,除非是 never
本身。复用该特性可对类型进行收窄(narrowing)操作。常见的使用场景是和 switch
语句搭配,达到保证 switch 穷举了目标所有可能值的目的。这个被 switch 的目标可以是 union 联合类型,也可以是 enum 枚举类型等。
考察如下示例代码,其中 Shape
类型包含一个形状种类的字段,该字段为一个枚举可包含多个可能的值:
enum ShapeKind {
Circle,
Square,
}
interface Shape {
kind: ShapeKind;
radius?: number;
sideLength?: number;
}
那么在计算对象面积时,需要根据不同类型来决定如何计算:
function getArea(shape: Shape) {
switch (shape.kind) {
case ShapeKind.Circle:
return Math.PI * shape.radius ** 2;
case ShapeKind.Square:
return shape.sideLength ** 2;
default:
const _exhaustiveCheck: never = shape.kind; // (property) Shape.kind: never
return _exhaustiveCheck;
}
}
通过前面 switch
语句,每条 case
都会将类型收窄,最后到 default
时 kind
就是 never
类型了。我们将它赋值给一个 never
类型的变量 _exhaustiveCheck
备用。
此时如果前面 case
少写了,或者后续有人将枚举进行扩充,添加了新的类型,
enum ShapeKind {
Circle,
Square,
+ Triangle,
}
此时 default
处 kind
就不是 never
类型了。由于文章开头提到的原因,任意类型(除了 never
自身)无法赋值给 never
类型,所以此处会报错:
const _exhaustiveCheck: never = shape.kind; // ❌ Type 'ShapeKind' is not assignable to type 'never'.ts(2322)
从而达到了保护作用,提示我们把新增的类型在 switch
语句中补上。
Recommend
-
67
格拉斯哥大学化学教授李·克罗宁(Lee Cronin)开发出一个可以运行多个化学实验的人工智能机器人,并利用质谱仪,核磁共振仪和红外光谱仪实时评估反应过程。通过并行运行化学反应,克罗宁希望能够减少有机化学家的工作,最终找出...
-
33
SSRF漏洞配合Flask的巧妙利用 - 内网漫游 Mar 21, 2020 SSRF 服务器请求伪造 SSRF(Server-side Request Forge, 服务端请求伪造)。由攻击者构造的...
-
21
应用开发时, 有人可能会有机会遇到需要自己制定 模板语法 的时候。 比如这几个场景: 1、 回复/评论/私聊 系统 的表情、链接 。 这种模块一般都不会采取富文本的形式来保存, 而是自己制...
-
9
第3-1课:装配线与工作站问题(穷举) ...
-
16
Daruk配合sqlite,typeorm的TypeScript编写体验前端开发话题下的优秀回答者上周五写了一篇Daruk文章,里面相关的例子代码只有一个简单的hello world,周末花了点时间写了一个简易...
-
9
使用ping命令来探测目标主机的操作系统类型 从 http://subinsb.com/default-device-ttl-values/ 里学到的 原来不同的操作系统默认的TTL(Time To Live)值是不同的,因此通过...
-
8
求助!穷举!
-
7
PassMark MemTest86 Pro 7.5内存(轮询/穷举)检测工具(赠送4.3.7版本传统版)_资源分享_IT密码内存以为能点亮系统就没事了吗?无故重启?意外死机?找不到问题在哪?可能是内存的锅。到底是人性的堕落还是道德的沦丧?一起来看看本文介绍的MemTest86,该软件可以...
-
6
利用基于Go Lang的Hugo配合nginx来打造属于自己的纯静态博客系统首页 - Go & Ruby/2019-05-23
-
3
在这篇文章,我不仅会具体介绍之前没有讲到的回溯算法写法,还会告诉你为什么可以那样写,两种写法的本质区别是什么。先说结论:1、回溯算法穷举的本质思维模式是「球盒模型」,一切回溯算法,皆从此出,别无二法。2、球盒模型,必然有两种穷举...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK