【TS】TypeScript 中的 any 与 unknown:理解与实践


鑫宝Code

🌈个人主页: 鑫宝Code
🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础
💫个人格言: "如无必要,勿增实体"


文章目录

  • TypeScript 中的 `any` 与 `unknown`:理解与实践
    • 一、引言
    • 二、`any`:灵活但危险的万能钥匙
      • 2.1 定义与特性
      • 2.2 使用场景
      • 2.3 风险与警告
    • 三、`unknown`:安全的未知
      • 3.1 定义与特性
      • 3.2 使用场景
      • 3.3 优势与限制
    • 四、`any` 与 `unknown` 的比较
    • 五、最佳实践
      • 5.1 限制`any`的使用
      • 5.2 利用`unknown`增强安全性
    • 六、结论

TypeScript 中的 anyunknown:理解与实践

在这里插入图片描述

在TypeScript的世界里,类型系统是其核心魅力所在,它帮助开发者在编码过程中捕捉类型错误,提高代码质量和可维护性。然而,在这个强类型体系中,anyunknown 两个类型显得尤为特别,它们在赋予开发者灵活性的同时,也考验着类型安全的界限。本文将深入探讨这两个类型的概念、差异、使用场景及最佳实践,帮助你更好地驾驭TypeScript的类型世界。

一、引言

TypeScript作为一种逐渐成为现代前端开发标配的编程语言,其静态类型系统为JavaScript增添了类型安全的保障。然而,现实世界中的代码并不总是那么简单明了,有时需要处理动态类型的数据或是遗留的JavaScript代码,这时anyunknown 就派上了用场。

二、any:灵活但危险的万能钥匙

在这里插入图片描述

2.1 定义与特性

any 类型是TypeScript中最宽泛的类型,它可以代表任何值。当你给一个变量指定为any类型时,TypeScript编译器将不再进行类型检查,无论是赋值、调用方法还是访问属性。

let anything: any = "Hello";
anything = 42;
anything.someFunction(); // 不会报错

2.2 使用场景

  • 遗留代码整合:在迁移旧的JavaScript项目至TypeScript时,面对未标注类型的代码,可以暂时使用any避免类型检查干扰,逐步迁移。
  • 第三方库兼容:部分未提供TypeScript类型定义的第三方库,可能需要使用any来标记未知类型的返回值或参数。

2.3 风险与警告

尽管any提供了极大的灵活性,但它也打破了TypeScript的类型安全壁垒,容易引入难以察觉的运行时错误。过度依赖any可能导致类型系统的优势荡然无存。

三、unknown:安全的未知

在这里插入图片描述

3.1 定义与特性

unknown 类型同样是表示未知类型的值,但它采取了更为保守和安全的策略。当你声明一个变量为unknown时,除了赋值给同样为unknown的变量外,几乎无法直接对其进行操作,除非通过类型断言或类型守卫验证其具体类型。

let somethingUnknown: unknown = "Hello";
let alsoUnknown: unknown = somethingUnknown; // 这是允许的
somethingUnknown.toUpperCase(); // 错误,无法确定类型

3.2 使用场景

  • 安全的数据处理:当你需要处理来自外部的、类型未知的数据时,使用unknown可以强制你在使用前进行类型检查,确保类型安全。
  • 函数返回值:当函数可能返回多种类型,而又不想使用联合类型时,unknown可以作为一种防御性编程手段。

3.3 优势与限制

相比anyunknown更强调类型安全,避免了因类型不确定导致的错误。然而,这也意味着需要更多的类型检查和转换步骤,增加了编码的复杂度。

四、anyunknown 的比较

  • 安全性unknown更加安全,因为它不允许未经检查的直接操作;而any则完全跳过类型检查,存在潜在风险。
  • 灵活性any提供了最大的灵活性,几乎可以自由地进行任何操作;相比之下,unknown在使用前需要显式类型断言或检查。
  • 使用原则:在可能的情况下,优先考虑使用unknown,尤其是当你关心类型安全时。仅在确实需要最大灵活性且愿意承担风险时,才考虑使用any

五、最佳实践

5.1 限制any的使用

  • 明确意图:使用any时,务必明确为何需要它,并尽可能缩小其作用范围。
  • 逐步替换:在项目初期或代码迁移阶段可以适度使用any,但应逐步替换为更具体的类型。

5.2 利用unknown增强安全性

  • 严格类型检查:在接收外部输入或处理不确定类型数据时,首选unknown,并通过类型守卫或类型断言确保类型安全。
  • 类型细化:结合类型守卫(如typeof, instanceof)或自定义类型保护函数来细化unknown类型,增加代码的可操作性。

六、结论

anyunknown 在TypeScript中扮演着重要但截然不同的角色。any提供了最大限度的灵活性,但牺牲了类型安全;而unknown则在保证安全的前提下,提供了处理未知类型数据的能力。理解它们的特性和正确使用,对于构建既强大又安全的TypeScript应用至关重要。在实践中,应尽量避免any的过度使用,转而倾向于unknown,并结合类型检查机制,以确保代码的健壮性和可维护性。

End

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

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

相关文章

如何学习大型语言模型中的量化

前言 图片来自作者:Flow 展示了量化的必要性。(笑脸和生气脸图片来自Yan Krukau) 在我解释上面的图表之前,让我先介绍一下您将在本文中学习的重点内容。 首先,您将了解量化是什么以及为什么量化。接下来,您将深入了解…

回文数(leetcode)

题目描述: 给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数 是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 示例: …

the problem when using langchain chat openai model and crewai same llm models

题意: when i am using langchain chat openai model and invoking method its working but when using in crewai same llm models it gives invalid api key 当你提到在使用 langchain 的 chatopenai 模型并调用方法时一切正常,但在 crewai 中使用相…

MySQL中使用PROFILING来查看SQL执行流程

在MySQL中,PROFILING功能提供了一种方式来分析SQL语句的执行时间,包括查询执行的各个阶段,如发送、解析、优化、执行等。这对于诊断性能问题非常有用。然而,需要注意的是,从MySQL 5.7.7版本开始,PROFILING功…

Java 线程池之FixedThreadPool

引言 在并发编程中,线程池是一种常用的资源管理模式,用于限制并发线程的数量,优化系统性能和资源使用。Java 提供了多种类型的线程池,其中 FixedThreadPool 是一种固定大小的线程池,适用于需要固定数量线程执行任务的…

小程序 npm 支持

使用 npm 包 目前小程序已经支持使用 npm 安装第三方包,因为 node_modules 目录中的包不会参与小程序项目的编译、 上传和打包,因此在小程序 项目中要使用的 npm 包,必须走一遍构建 npm 的过程。在构建成功以后,默认 会在小程序目…

【keil5问题】keil5中突然debug调试不能全速运行的问题

1、问题现象: 原本的项目工程是正常debug单步调试,然后突然出现是点击左上角的run全速运行,也全速运行不了,出现如下图的情况,点一次一步走的现象 2、问题解决: 2-1、问题分析: 点击reset、…

关于pytorch的加载数据,cpu init, cpu getitem, gpu init

文章目录 一. (cpu,init)图像加载到CPU内存,是在 __init__中函数中全部数据, 然后在item中取图像二.(cpu,get_item)是图像在 get_item函数中,载入图像到CPU三(gpu,init)是将图像加载到GPU, 在init函数中 跑多光谱估计的代码,参考:…

如何使用 uni-app 快速集成聊天会话能力?

移动互联网时代,即时通讯(IM)功能是许多app不可或缺的一部分,然而在即时通讯app开发时,开发者常常面临着选择困难:是为每个平台单独开发应用,还是有限开发某个平台?uni-app的出现&am…

BLOB视频技术原理,如何将Blob视频转换为MP4格式?

BLOB视频的制作涉及将视频数据转换为二进制大对象(BLOB)格式,然后对其进行编码、分割、封装和传输。在目标设备上,BLOB数据被解析、解码和播放,同时可能需要进行实时的优化以适应播放条件。这种制作方式旨在提供一种高…

linux监控服务器磁盘、内存空间使用率到达90%发送邮件脚本

以下是一个使用Python编写的Linux监控服务器磁盘、内存空间使用率并在达到90%时发送邮件的脚本: import os import smtplib from email.mime.text import MIMEText from email.header import Header# 设置阈值 DISK_THRESHOLD 90 MEMORY_THRESHOLD 90# 获取磁盘使…

7月11日云技术研讨会 | 车载信息安全全流程实施方案

伴随着汽车的智能网联化发展,网络攻击也逐渐渗透漫延至汽车领域,汽车行业面临着重大的信息安全挑战。此外,UNECE WP.29 R155和ISO/SAE 21434等标准也对汽车的信息安全提出了规范化要求,旨在分阶段将产品全生命周期中由信息安全威胁…

中介子方程四十二

XXFXXuXXWXXuXXdXXrXXαXXuXpXXKXηXiXXnXXyXηXuXXrXXaXnXXαXLXyXXWXuXeXuXWXXyXLXαXXnXaXXrXXuXηXyXXnXXiXηXKXXpXuXXαXXrXXdXXuXWXπXXWXeXyXeXbXπXpXXNXXqXeXXrXXαXXuXpXXKXηXiXXnXXyXηXuXXrXXaXnXXαXLXyXXWXuXeXuXWXXyXLXαXXnXaXXrXXuXηXyXXnXXiXηXKXXpXuXXα…

JavaScript中的this指向

1. 全局环境下的this 在全局环境中(在浏览器中是window对象,在Node.js中是global对象),this指向全局对象。 console.log(this window); // 在浏览器中为true console.log(this.document ! undefined); // true,因为…

opencv编译报错OpenCV does not recognize MSVC_VERSION “1940“

具体如下: CMake Warning at cmake/OpenCVDetectCXXCompiler.cmake:182 (message):OpenCV does not recognize MSVC_VERSION "1940". Cannot set OpenCV_RUNTIME Call Stack (most recent call first):CMakeLists.txt:174 (include) 打开源码\opencv\sources\cmak…

如何加密U盘?U盘加密软件推荐

U盘是我们最常用的移动存储设备,可以帮助我们随身携带大量数据。为了避免U盘数据泄露,我们需要加密保护U盘。那么,U盘该如何加密呢?下面小编就为大家推荐两款专业的U盘加密软件。 U盘超级加密3000 U盘超级加密3000是一款优秀的U盘…

大模型概述-定义/分类/训练/应用

大模型概述 随着时代的发展, 大模型各个领域的应用正在不断扩大. 本文尽力梳理各种材料, 将从概念定义, 类型分类, 训练以及应用等方面对大模型进行一个简要的概述. 如果你想了解大模型但是却缺乏基础的知识或者觉得无从下手, 那么阅读该文章可能对你有所帮助. 如果想了解更多…

react antd表格翻页时记录勾选状态

在Ant Design的React表格(Table)组件中,如果需要在翻页时记住勾选状态,可以通过以下步骤实现: 使用rowSelection属性来控制勾选状态,并添加preserveSelectedRowKeys: true以保留 key。 设置rowKey属性。 …

Django任意URL跳转漏洞(CVE-2018-14574)

目录 Django介绍 URL跳转漏洞介绍 Django任意URL跳转漏洞介绍 环境搭建 防御方法 前段时间在面试时,问到了URL跳转漏洞,我没有回答好,下午把URL跳转漏洞学习了,发现也不难,看来还需要学习的东西很多呀&#xff0c…

cadence symbol修改之一

cdaence virtuoso 复制cell,或者拷贝symbol之后,再次调用的时候,symbol还是跟随原来的cell名字 解决办法 打开对应的symbol 修改partName为 cellName