7. TypeScript中的Any, Unknown, Void, Never类型

在TypeScript的类型系统中,anyunknownvoidnever这四种类型扮演着特殊的角色。它们各自有着不同的用途和行为,理解它们的差异对于编写类型安全的TypeScript代码至关重要。本文将深入探讨这四种类型的特性和使用场景,帮助你更好地利用TypeScript的强大类型系统。

Any类型

any类型是TypeScript类型系统中最灵活的类型,它是为了兼容原来JS的模式,允许你绕过类型检查,相当于是没有类型。一旦类型被赋予any类型,实际上就失去了TypeScript的类型保护功能。

Any类型的使用场景

  • 与现有的JavaScript代码集成:当你将一个JavaScript项目迁移到TypeScript时,any类型可以帮助你逐步进行迁移,而不是一次性重写所有类型。
  • 处理复杂的库或API:有些第三方库或API的类型可能非常复杂或尚未被完全定义,此时使用any可以作为临时解决方案。
  • 测试和原型开发:在快速原型开发或编写测试代码时,any类型可以减少类型定义的工作量。

Any类型的风险

  • 类型安全的丧失:使用any类型会使得TypeScript的类型检查变得无效,这可能会导致运行时错误。
  • 自动补全和智能提示的缺失:由于any类型可以是任何类型,IDE无法提供准确的代码补全和智能提示。
  • 代码重构的困难:在重构代码时,any类型的存在可能会导致潜在的问题被忽视。

Any类型举例

let anything: any = "hello";
anything = 42; // OK
anything = true; // OK

虽然any类型在某些情况下非常有用,比如在你不确定一个变量的类型时,但过度使用any会降低TypeScript类型系统带来的好处。因此,建议尽量避免使用any类型,除非真的有必要。

Unknown类型

unknown类型是TypeScript 3.0引入的新类型,它可以被认为是any类型的类型安全对应。unknown类型的变量可以接受任何类型的值,但将unknown类型的变量赋值给其他类型的变量时,需要进行类型检查或类型断言。

Unknown类型的使用场景

  • 更安全的动态内容处理:当你需要处理来自外部的、类型未知的数据时,unknown类型可以确保你在不确定类型的情况下不会意外地操作该数据。
  • 作为更好的any替代品:在你想要禁止类型检查的逃逸行为时,unknown类型是一个更好的选择,因为它强制进行显式的类型检查。

Unknown类型举例

let something: unknown = "hello";
// 下面的代码会报错,因为不能将类型“unknown”直接赋值给类型“string”
// let myString: string = something;// 使用类型断言
let myString: string = something as string;

unknown类型鼓励你在不确定变量类型时进行显式的类型检查,从而提高代码的安全性。

Void类型

void类型用于表示没有任何类型,通常用在函数没有返回值的情况。

function logMessage(message: string): void {console.log(message);
}

在TypeScript中,如果一个函数没有返回语句,或者返回语句不返回任何内容,那么它的返回类型就是void

Never类型

never类型表示的是那些永远不存在的值的类型。例如,never类型用于表示那些总是会抛出异常或根本就不会有返回值的函数的返回类型。

function error(message: string): never {throw new Error(message);
}function infiniteLoop(): never {while (true) {}
}

never类型也可以用于表示永远不会发生的类型检查情况。

type Foo = string | number;function controlFlowAnalysisWithNever(foo: Foo) {if (typeof foo === "string") {// foo在这里是string类型} else if (typeof foo === "number") {// foo在这里是number类型} else {// foo在这里是never类型const check: never = foo;}
}

总结

anyunknownvoidnever这四种类型在TypeScript中各有其用途。any提供了最大的灵活性,但应谨慎使用以避免失去类型安全。unknown是一个更安全的选择,它要求开发者在不确定类型时进行显式的类型检查。void用于标识没有返回值的函数,而never用于表示那些永远不会返回的函数或不可能的类型情况。理解这些类型的差异和适用场景,将帮助你更有效地利用TypeScript的类型系统,编写更安全、更可维护的代码。

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

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

相关文章

美团一面,面试官让介绍AQS原理并手写一个同步器,直接凉了

写在开头 今天在牛客上看到了一个帖子,一个网友吐槽美团一面上来就让手撕同步器,没整出来,结果面试直接凉凉。 就此联想到一周前写的一篇关于AQS知识点解析的博文,当时也曾埋下伏笔说后面会根据AQS的原理实现一个自定义的同步器…

【MySQL数据库 | 第二十五篇】深入探讨MVCC底层原理

前言: 在当今互联网时代,数据库扮演着数据存储和管理的关键角色。对于大型Web应用程序和企业级系统而言,高效地处理并发访问和事务管理是至关重要的。多版本并发控制(MVCC)是一种数据库事务处理的技术,旨…

【CV】ORB算法

1. ORB算法: 特点: 实现了旋转不变性、尺度不变性和计算效率高等特性。 旋转不变性: 通过计算关键点周围的梯度信息,确定关键点的主方向。将图像旋转到关键点的主方向,然后再提取BRIEF描述符,增强了旋转不…

【软件测试】个人博客系统测试

个人博客系统测试 一、项目背景1.1 技术背景1.2 功能背景 二、自动化测试2.1 什么是自动化测试2.2 通过使用selenium进行自动化测试的编写(Java实现)2.3 编写测试用例,执行自动化测试2.3.1 输入用户名:test,密码:123,登录成功2.3.…

CRM集成:解锁业务增长与客户关系管理的关键

预计从2021年至2028年,CRM领域的市场规模将大幅跃升,从约580亿美元增长至1290亿美元。这一显著的增长并非偶然,而是源于CRM平台为企业带来的巨大价值。客户关系管理平台助力销售高效开发潜在客户,客户成功经理有效支持客户&#x…

unable to find a medium containing a live file system解决办法!

背景: 用Ventoy制作U盘系统安装盘,只需要把ISO镜像拷进去就可以,可以放多少个镜像取决于U盘的大小,无需重复制作。Ventoy 将U盘的第一个分区默认格式化为exFAT文件系统来存放ISO文件。 但是,今天鲲鹏920平台安装银河…

Golang | Leetcode Golang题解之第16题最接近的三数之和

题目&#xff1a; 题解&#xff1a; func threeSumClosest(nums []int, target int) int {sort.Ints(nums)var (n len(nums)best math.MaxInt32)// 根据差值的绝对值来更新答案update : func(cur int) {if abs(cur - target) < abs(best - target) {best cur}}// 枚举 a…

心跳机制原理学习

心跳机制 应用场景&#xff1a; 在长连接下&#xff0c;有可能很长一段时间都没有数据往来。理论上说&#xff0c;这个连接是一直保持连接的&#xff0c;但是实际情况中&#xff0c;如果中间节点出现什么故障是难以知道的。更要命的是&#xff0c;有的节点&#xff08;防火墙…

【鸿蒙开发】组件状态管理@Prop,@Link,@Provide,@Consume,@Observed,@ObjectLink

1. Prop 父子单向同步 概述 Prop装饰的变量和父组件建立单向的同步关系&#xff1a; Prop变量允许在本地修改&#xff0c;但修改后的变化不会同步回父组件。当父组件中的数据源更改时&#xff0c;与之相关的Prop装饰的变量都会自动更新。如果子组件已经在本地修改了Prop装饰…

【数据结构练习题】队——1.用队实现栈2.用栈实现队

♥♥♥♥♥个人主页♥♥♥♥♥ ♥♥♥♥♥数据结构练习题总结专栏♥♥♥♥♥ ♥♥♥♥♥上一章&#xff1a;堆的练习题♥♥♥♥♥ 文章目录 1.用队去实现栈1.1问题描述1.2思路分析1.3绘图分析1.4代码实现2.用栈实现队2.1问题描述2.2思路分析1.3绘图分析2.4代码实现 1.用队去实现…

FreeRTOS学习 -- 再识

工作中一直使用FreeRTOS进行着开发&#xff0c;但是没有进行过系统的总结过。现在将快速使用几天时间将FreeRTOS相关知识点加以总结。 官网&#xff1a; https://www.freertos.org/zh-cn-cmn-s/ 参看资料&#xff1a; 正点原子 STM32F1 FreeRTOS开发手册_V1.2.pdf The FreeRTOS…

Linux CPU利用率

Linux CPU利用率 在线上服务器观察线上服务运行状态的时候&#xff0c;绝大多数人都是喜欢先用 top 命令看看当前系统的整体 cpu 利用率。例如&#xff0c;随手拿来的一台机器&#xff0c;top 命令显示的利用率信息如下 这个输出结果说简单也简单&#xff0c;说复杂也不是那么…

MySQL——Linux安装包

一、下载安装包 MySQL下载路径&#xff1a; MySQL :: MySQL Downloads //默认下载的企业版MySQL 下载社区版MySQL MySQL :: MySQL Community Downloads 1、源码下载 2、仓库配置 3、二进制安装包 基于官方仓库安装 清华centos 软件仓库&#xff1a; Index of /cen…

使用Mac自带终端进行远程ssh连接Linux服务器

废话不多说&#xff0c;直接上图 好吧&#xff0c;我承认我是多此一举&#xff0c;脱裤子放pi了&#xff0c;其实只需要在终端输入一行命令就可以了&#xff08;呜呜&#xff5e;&#xff09; ssh rootip -p 22 需要注意的是&#xff0c;命令里的ip地址同样要替换成你自己的服…

前端工程化理解 (2024 面试题)

最好介绍远古世界最好随性一点&#xff0c;不要太刻板 &#xff0c;不然像背书 什么是前端工程化&#xff1f; - 知乎 前端工程化的历史 互联网初期&#xff0c;09 年以前&#xff0c;页面只需要展示一些列表、表格、文章内容以及简单图片即可&#xff0c;其目的是为了传送信…

证明:有依赖背包结点数优化后为O(n^2)

证明&#xff1a;有依赖背包结点数优化后为 O ( n 2 ) O(n^2) O(n2) siz[u]表示以u为根的树的结点数 深搜过程中&#xff0c;siz[u]表示根结点为u的树的根结点加上前i个子树的结点数。 根结点为u的树取前i个子树的结点&#xff0c;取到的结点数量小于等于siz[u]根结点为v的子…

SpringCloudAlibaba

文章目录 一、SpringCloudAlibaba是什么&#xff1f;二、核心组件1 Nacos1.1 Nacos介绍1.2 什么是Nacos&#xff1f;1.3 为何使用Nacos&#xff1f; 2.Sentinel2.1 什么是Sentinel2.2 Sentinel好处 3 GateWay3.1 网关介绍3.2 GateWay3.3 基本概念&#xff1a; 4 Seata4.1 分布式…

4.进程相关

1.关于进程和程序的相关定义 1.1 程序的相关定义 程序通俗来讲就是我们的源代码文件&#xff0c;然后里面还包含了其他的文件信息 程序入口地址&#xff1a;也就是 main 函数的位置 1.2 进程的相关定义 进程需要资源&#xff1a;CPU &#xff0c;内存 进程是一个抽象定义&a…

QDataStream:使用指南、技巧与注意事项

QDataStream是Qt框架中用于处理二进制数据序列化和反序列化的核心类。它提供了高效、跨平台的方式&#xff0c;将C数据结构转化为字节流&#xff0c;便于在网络传输、持久化存储等场景下使用。本文将详尽解析QDataStream的使用方法、实用技巧以及在实际应用中应注意的问题。 一…

免费游戏云服务器推荐,一键搭建我的世界(MC)及幻兽帕鲁服务器!

随着云计算的普及和发展&#xff0c;越来越多的人开始尝试在云服务器上搭建游戏服务器。本文将为大家推荐一款免费游戏云服务器&#xff0c;可以一键搭建我的世界(MC)或者幻兽帕鲁服务器。 雨云是一家国内的云计算服务提供商&#xff0c;为了吸引用户&#xff0c;推出了积分免费…