8.【TypeScript 教程】Never 与 Unknown

TypeScript Never 与 Unknown

本节介绍 never 和 unknown 类型,其中 unknown 类型作为 any 类型对应的安全类型使用起来更加安全,如果有 any 类型的使用需求,应尽量使用 unknown 类型来替代 any 类型。

1. 解释

never 类型表示那些永不存在的值的类型。

unknown 类型是 any 类型对应的安全类型。

2. never 类型

never 类型是任何类型的子类型,也可以赋值给任何类型;然而,没有类型是 never 的子类型或可以赋值给 never 类型(除了 never 本身之外)。 即使 any 也不可以赋值给 never。

2.1 应用场景

一个抛出异常的函数表达式,其函数返回值类型为 never:

function error(message:string): never {throw new Error(message)
}

同样的,不会有返回值的函数表达式,其函数返回值类型也为 never:

// 推断的返回值类型为 never
function fail(): never {return error("Something failed")
}

不能取得值的地方:

interface Foo {type: 'foo'
}interface Bar {type: 'bar'
}type All = Foo | Barfunction handleValue(val: All) {switch (val.type) {case 'foo':breakcase 'bar':breakdefault:// 此处不能取值const exhaustiveCheck: never = valbreak}
}

代码解释: 代码中所用到的接口声明(interface)、类型别名(type)、联合类型(A | B)之后都有专门小节介绍。

3. unknown 类型

我们知道 any 无需事先执行任何类型的检查:

let value: anyvalue = true             // OK
value = 10               // OK
value = "Hello World"    // OK
value = []               // OK
value = {}               // OK
value = Math.random      // OK
value = null             // OK
value = undefined        // OK
value = new TypeError()  // OK
value = Symbol('name')   // OKvalue.foo.bar            // OK
value.trim()             // OK
value()                  // OK
new value()              // OK
value[0][1]              // OK

在许多情况下,这太宽松了。 unknown 类型呢?

let value: unknownvalue = true             // OK
value = 10               // OK
value = "Hello World"    // OK
value = []               // OK
value = {}               // OK
value = Math.random      // OK
value = null             // OK
value = undefined        // OK
value = new TypeError()  // OK
value = Symbol('name')   // OK

所有对该 value 变量的分配都被认为是类型正确的。

但是,如果尝试:

let value: unknownlet value1: unknown = value   // OK
let value2: any = value       // OKlet value3: boolean = value   // Error
let value4: number = value    // Error
let value5: string = value    // Error
let value6: object = value    // Error
let value7: any[] = value     // Error

可以看到,该 unknown 类型只能分配给 any 类型和 unknown 类型本身。

现在继续尝试:

let value: unknownvalue.foo.bar  // Error
value.trim()   // Error
value()        // Error
new value()    // Error
value[0][1]    // Error

unknown 类型在被确定为某个类型之前,不能被进行诸如函数执行、实例化等操作,一定程度上对类型进行了保护。

在那些将取得任意值,但不知道具体类型的地方使用 unknown,而非 any

4. 小结

到本节为止我们介绍了 TypeScript 的各种基本类型。

TypeScript 的类型系统会对数据进行类型检查,它可以在编译阶段规避不必要的错误,并且语义化清晰,有助于代码的阅读。

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

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

相关文章

Matlab | SISO系统差分方程求解(附matlab源码)

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== SISO系统差分方程求解 最小二乘法原理分析实验程序实验结果

JWT---JSON Web Token

JSON Web Token是什么 JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。 JSON Web Token的结构是什么样的 JSON…

QTableView如何设置显示风格?

1. 利用样式表设定样式风格 QTableView 控件本身没有直接的显示风格设置。然而,您可以通过使用样式表来自定义 QTableView 的外观,以实现不同的显示风格。以下是一些样式属性和伪状态类,您可以在样式表中使用来自定义 QTableView 的显示风格…

【每日一题】构造有效字符串的最少插入数

文章目录 Tag题目来源解题思路方法一:考虑 abc 的个数 写在最后 Tag 【字符串】【2024-01-11】 题目来源 2645. 构造有效字符串的最少插入数 解题思路 方法一:考虑 abc 的个数 思路 如果答案由 t 个 “abc” 组成,那么需要插入字符个数为…

QEMU源码全解析 —— PCI设备模拟(3)

接前一篇文章: 2. PCI设备的模拟 QEMU模拟的设备很多都是PCI设备,本节介绍PCI设备的模拟。与所有设备类似,PCI设备的父设备也是TYPE_DEVICE,其定义在QEMU源码根目录/hw/pci/pci.c中,代码如下: static con…

概率论与数理统计-第7章 假设检验

假设检验的基本概念 二、假设检验的基本思想 假设检验的基本思想实质上是带有某种概率性质的反证法,为了检验一个假设H0,是否正确,首先假定该假设H0正确,然后根据抽取到的样本对假设H0作出接受或拒绝的决策,如果样本观察值导致了…

二叉树的创建与遍历

对于前序遍历,首先访问当前节点,然后递归地遍历左子树和右子树。 这就是为什么前序遍历的代码中,首先是 printf("%d ", root->data);。中序遍历: 对于中序遍历,首先递归地遍历左子树,然后访问…

js 捕获 await 的报错

函数封装 func.js // 捕获 await 的错误 export const to (promise, errorExt, ) > {return promise//成功,则error返回null,result返回data.then((data) > [null, data])//错误则捕获错误内容,然后返回错误信息,result为u…

leetcode-x的平方根

69. x 的平方根 此题使用二分法做 class Solution:def mySqrt(self, x: int) -> int:left 1right xwhile left < right:mid (left right) // 2if x mid ** 2:return midelif x > mid ** 2:left mid 1else:right mid - 1return right

JavaScript 中 0.1 + 0.2 != 0.3:浮点数运算的陷阱

引言 在日常的 JavaScript 开发中&#xff0c;我们经常会面对一些看似简单的数学运算。然而&#xff0c;当我们执行 0.1 0.2 这样的操作时&#xff0c;很多人可能会感到困惑&#xff0c;因为预期的结果应该是 0.3&#xff0c;但实际上却是一个略微不同的值。这个现象是由于 J…

5、C语言:结构

结构 结构的基本知识结构与函数传递结构 结构数组、指向结构的指针自引用结构&#xff08;二叉树&#xff09;表查找类型定义&#xff08;typedef&#xff09;联合位字段 结构也是一种数据类型。类似于int、char、double、float等。 结构是一个或多个变量的集合&#xff0c;这些…

c++学习笔记-STL案例-机房预约系统1-准备工作

前言 准备工作包括&#xff1a;需求分析、项目创建、主菜单实现、退出功能实现 目录 1 机房预约系统需求 1.1 简单介绍 1.2 身份介绍 1.3 机房介绍 1.4 申请介绍 1.5 系统具体要求 1.6 预约系统-主界面思维导图 2 创建项目 2.1 创建项目 2.2 添加文件 ​编辑 3 创建…

页面跳转后,默认选中tree节点并高亮显示

1.场景 操作步骤&#xff1a; 1.点击数据连接数&#xff0c;打开弹窗 2.点击连接状态跳转到数据连接模块 3.默认选中tree的数据源id节点 2.代码 参数解释&#xff1a; 3.实现逻辑 首先将id通过组件传参的方式传过去&#xff0c;数据连接接收后&#xff0c;在tree里设置…

ubuntu 挂载新硬盘

1、检测新硬盘 新增加硬盘&#xff0c;检测硬盘识别情况。 命令检查&#xff1a;sudo fdisk -l 3、格式化磁盘 格式化&#xff1a;sudo mkfs.ext4 /dev/sdb 其中&#xff0c;/dev/sdb是新分区的设备文件名&#xff0c;ext4是要使用的文件系统类型。 4、挂载新分区 sudo mk…

【银行测试】24年金融银行项目,10道高频测试面试题汇总...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 面试题1&#xff…

使用AUTOSAR来开发汽车基础软件的优点

1、高质量。以前我们采用手写代码的方式&#xff0c;是几个工程师在战斗。现在我们采用平台&#xff0c;BSW代码都是供应商提供的&#xff0c;我们相当于后面还有一个团队陪着我们在战斗。 2、低成本。大家都说采用AUTOSAR平台好贵&#xff0c;但是从长远来看是值得的&#xff…

计算机毕业设计----ssm开发的Java快递代拿系统

使用技术 采用 Spring SpringMVC MyBatisPlus&#xff0c;连接池采用 Druid&#xff0c;安全框架使用 Shiro&#xff0c;前端采用 Bootstrap layer 实现。 支付采用支付宝沙箱环境&#xff0c;支付APP下载链接&#xff0c;[点击这里](https://sandbox.alipaydev.com/user/…

SpringBoot中使用SpringEvent业务解耦神器实现监听发布事件同步异步执行任务

场景 SpringBoot中使用单例模式ScheduledExecutorService实现异步多线程任务(若依源码学习)&#xff1a; SpringBoot中使用单例模式ScheduledExecutorService实现异步多线程任务(若依源码学习)-CSDN博客 设计模式-观察者模式在Java中的使用示例-环境监测系统&#xff1a; 设…

GPT实战系列-简单聊聊LangChain

GPT实战系列-简单聊聊LangChain LLM大模型相关文章&#xff1a; GPT实战系列-ChatGLM3本地部署CUDA111080Ti显卡24G实战方案 GPT实战系列-Baichuan2本地化部署实战方案 GPT实战系列-大话LLM大模型训练 GPT实战系列-探究GPT等大模型的文本生成 GPT实战系列-Baichuan2等大模…

SpringBoot中使用LocalDateTime踩坑记录

文章目录 前言一、为什么推荐使用java.time包的LocalDateTime而不是java.util的Date&#xff1f;二、使用LocalDateTime和LocalDate时遇到了哪些坑&#xff1f;2.1 Redis序列化报错2.1.1 问题现象2.1.2 问题分析2.1.3 解决方案 2.2 LocalDateTime和LocalDate类型的属性返回给前…