停止在 TypeScript 中使用 any 类型

停止在 TypeScript 中使用 any 类型

TypeScript 是 Web 开发人员中最常用的编程语言之一。它具有出色的语言功能,允许我们轻松设计可扩展的应用程序。因此,开发人员倾向于在项目中选择 TypeScript 而不是 JavaScript。

然而,在使用 TypeScript 以最大限度地发挥其功能时,我们需要避免一些常见的错误。例如,过度使用 any 类型是我们经常犯的一个常见错误。虽然听起来很简单,但过度使用 any 类型可能完全违反 TypeScript 的基本原理。

因此,在本文中,我们将讨论过度使用 any 类型的问题、any 类型的替代方案以及何时应该和不应该使用 any 类型,以便让我们更好地理解。

TypeScript 中的 any 类型是什么

在 TypeScript 中定义变量时,必须显式告知变量的类型。例如,如果我们使用 string 作为数据类型,TypeScript 会理解该变量只能具有字符串值。如果我们尝试为变量分配不同类型的值,TypeScript 将显示错误。

例如,下面的代码片段会给我们提示 Type ‘number’ is not assignable to type ‘string’ 错误:

let myVariable: string = '';
myVariable = 20;// error - Type 'number' is not assignable to type 'string'.(2322)

在这里插入图片描述
同样,any 是 TypeScript 中另一种可用的数据类型。但它与其他变量不同,因为 any 会告诉 TypeScript 该变量可以具有任何值。因此,如果我们使用 any 类型定义变量,则可以将数字、字符串、布尔值甚至对象分配给该变量,而不会出现错误。

let myVariable: any = 'String Value';
console.log('Value of myVariable : ' + myVariable);myVariable = 20;
console.log('Value of myVariable : ' + myVariable);myVariable = false;
console.log('Value of myVariable : ' + myVariable);

在这里插入图片描述
有些人可能认为这是定义项目中所有变量的好方法。但使用 any 类型都会带来一些重大缺点,它会使我们的 TypeScript 项目类似于常规 JavaScript 项目。那么,我们来讨论一下为什么我们不应该在 TypeScript 中使用任何类型来定义变量。

为什么我们不应该使用任何类型

类型检查是 TypeScript 最重要的功能之一。通过检查数据分配和类型转换,它有助于避免应用程序中出现意外问题。

当我们使用 any 类型时,变量将没有特定的数据类型,我们可以将多种类型的值分配给同一个变量。此外,编译器不会对 any 类型定义的变量执行类型检查,我们的项目将看起来像一个常规的 JavaScript 项目。

那么,为什么 TypeScript 还提供了一个名为 any 的数据类型。在某些特定情况下,any 类型会显得特别有用。作为开发人员,我们应该能够识别这些情况并相应地应用 any 类型。

我们什么时候应该使用任何类型

如前所述,任何类型的引入都是出于某些特定原因。以下是我们必须使用 any 类型的一些最常见和最重要的情况。

1. 用于迁移

当我们最初将 JavaScript 项目迁移到 TypeScript 时,any 类型是一个很有价值的选项。例如,如果我们要将 AngularJS 项目迁移到新的 Angular 版本,则可以使用 any 类型来处理尚未迁移的变量类型。

2. 匹配三方库

有时,我们可能会遇到 any 类型的第三方库。在这种情况下,我们必须在项目中使用 any 类型才能使用该库。但请确保尽快将它们转换为正确的类型。

3. 处理类型错误

处理 TypeScript 类型错误是我们可能需要 any 类型的另一种情况。如果找不到任何其他解决方案,可以使用 any 类型来解决问题,并稍后将其转换为合适的类型。

有哪些替代 any 的方案

如上所述,any 类型的主要目的是解决开发人员在使用 TypeScript 时可能面临的一些特定场景。然而,开发人员经常面临无法决定变量的特定类型的情况。因此,让我们讨论在这种情况下可以使用的替代方案,而不使用 any 类型。

1.unknown

当我们不知道变量的类型时,使用 unknown 是最好的选择。与 any 不同的是unknown 在确保变量的类型安全时,同时允许我们为变量分配多种类型。

例如,我们可以定义一个具有 unknown 类型的变量,并稍后为其分配任何类型的值:

let myVariable: unknowon = 'unknown type variable';
console.log('Value of myVariable : ' + myVariable);myVariable = 20;
console.log('Value of myVariable : ' + myVariable);myVariable = false;
console.log('Value of myVariable : ' + myVariable);

在这里插入图片描述
如我们所见,unknown 类型变量与 any 类型变量的工作方式相同。但是,如果我们尝试将它们分配给另一个变量,any 和 unknown 之间是存在差异的。如果我们的变量属于 any 类型,则可以将其分配给另一个变量而不会出现错误。但是,如果我们尝试将 unknown 类型变量分配给具有正确类型的变量,我们将看到错误。

// unknown type
let myVariable1: unknown = 'unknown type variable';
console.log('Value of myVariable1 : ' + myVariable1);let myVariable2: string =  myVariable1;
console.log('Value of myVariable2 : ' + myVariable2);

在这里插入图片描述

2. 使用 Interface

对象定义是开发人员使用 any 类型的另一个常见场景,因为它不需要额外的工作。然而,使用 Interface 是处理 TypeScript 中对象类型的最合适的方法。

例如,假设我们需要定义一个名为 article 的对象,该对象具有 title、writer 和views 的属性。如果使用 any 类型,则可以轻松定义对象,如下所示:

const article: any = {title: 'TypeScript',writer: 'Chameera',views: 10000
}

否则,我们可以在定义对象的同时创建 Interface ,如下所示:

// Interface
interface Article {title: string;writer: string;views: number;
}// Object
const article: Article = {title: 'TypeScript',writer: 'Chameera',views: 10000
}

与 Interface 类似,我们也可以使用类型注释来创建对象类型:

const article: {title: string;writer: string;views: number;
} = {title: 'TypeScript',writer: 'Chameera'views: 10000
}

使用 unknown 类型和 Interface 是替代 any 类型的最佳选择。这两种方法都是类型安全的,可确保我们不会失去任何 TypeScript 优势。

结论

any 是 TypeScript 中可用的独特数据类型。引入它是为了处理一些独特的场景,例如 JavaScript 到 TypeScript 的迁移。但是,在使用类型之前我们应该三思而后行,因为它会禁用对使用 any 类型定义的变量和对象的类型检查。

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

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

相关文章

Python全栈之基本数据类型详解

文章目录 1.注释2.输出3.变量4.命名规范5.变量的定义方式1.字符串类型2.数字类型3.List列表类型4.tuple 元组类型的定义5.Dict字典类型6.set集合类型7.数据类型转换8.自动类型转换9.强制类型转换关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品…

《opencv实用探索·七》一文看懂图像卷积运算

1、图像卷积使用场景 图像卷积是图像处理中的一种常用的算法,它是一种基本的滤波技术,通过卷积核(也称为滤波器)对图像进行操作,使用场景如下: 模糊(Blur): 使用加权平…

模糊C均值(Fuzzy C-means,FCM)聚类的可运行的python程序代码,复制即可用!!切记需要安装库 scikit-fuzzy

文章目录 前言一、安装库 scikit-fuzzy二、具体程序代码(复制可运行)三、结果展示总结 前言 模糊C均值(Fuzzy C-means,FCM)聚类是一种软聚类方法,它允许数据点属于多个聚类,每个数据点对所有聚…

16.Oracle数据库Row_number() over()函数排序使用方法

1.原始数据(部分) SELECT * FROM SCOTT.EMP ; 2.使用Row_number() over() 函数,排序 SELECT EMPNO,ENAME,SAL,DEPTNO,Row_number() over( order by sal) rs FROM SCOTT.EMP ; 根据工资排序并添加序号 3.使用Row_number() over() 函数,分组并排序 SELECT EMPNO,ENAME,SAL,DEPTN…

Python语言学习笔记之七(JOSN应用)

本课程对于有其它语言基础的开发人员可以参考和学习,同时也是记录下来,为个人学习使用,文档中有此不当之处,请谅解。 1、认识Json JSON (JavaScript Obiect Notation)是一种轻量级的数据交换格式,它是ECMAScript的一…

防孤岛装置在光伏发电、燃气发电等新能源并网供电系统的应用

• AM5SE-IS防孤岛保护装置主要适用于35kV、10kV及低压380V光伏发电、燃气发电等新能源并网供电系统。 • 当发生孤岛现象时,可以快速切除并网点,使本站与电网侧快速脱离,保证整个电站和相关维护人员的生命安全**。 保护功能** ● 三段式过流…

Linux git

1.Git 初识 不知道你⼯作或学习时,有没有遇到这样的情况:我们在编写各种⽂档时,为了防止文档丢失,更改失误,失误后能恢复到原来的版本,不得不复制出⼀个副本,⽐如: “报告-v1”? …

机器视觉新功能上线:同步训练多个模型,智造的脚步又加快了!

“AI视觉”的应用,为当下诸多企业的生产智能化打开了新的想象空间。其中,深度学习作为AI视觉的核心技术,在实际应用中往往需要经历一个耗时较长的阶段——深度学习神经网络模型训练。其目的是通过使用已标注的数据集来训练模型,使…

基于mps的pytorch 多实例并行推理

背景 大模型训练好后,进行部署时,发现可使用的显卡容量远大于模型占用空间 。是否可以同时加载多个模型实例到显存空间,且能实现多个实例同时并发执行?本次实验测试基于mps的方案,当请求依次过来时,多个相…

一种LED驱动专用控制电路方案

一、基本的概述 TM1651 是一种带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路,内部集成有MCU 数字接口、数据锁存器、LED 高压驱动、键盘扫描等电路。本产品性能优良,质量可靠。采用SOP16/DIP16的封装形式。 二、特性说…

整体迁移SVN仓库到新的windows服务器

一、背景 公司原有的SVN服务器年代比较久远经常出现重启情况,需要把SVN仓库重新迁移到新的服务器上,在网上也搜到过拷贝Repositories文件直接在新服务器覆盖的迁移方案,但考虑到原有的操作系统和现有的操作系统版本不一致,SVN版本…

frp 配置内网访问

frp介绍 frp 是一个开源、简洁易用、高性能的内网穿透软件,支持 tcp, udp, http, https 等协议。frp 项目官网是 https://github.com/fatedier/frp 下载地址: https://github.com/fatedier/frp/releases frp工作原理 服务端运行,监听一个…

分治算法——75. 颜色分类

文章目录 🌿0. 分治🌻1. 题目🌼2. 算法原理🌴3. 代码实现 🌿0. 分治 分治分治,顾名思义分而治之,将一个大问题转换成若干个子问题,再将这些子问题的基础上继续划分成更小的子问题&a…

PyQt基础_011_对话框类控件QMessage

基本功能 import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import *class WinForm( QWidget): def __init__(self): super(WinForm,self).__init__() self.setWindowTitle("QMessageBox") self.resize(300, 100) self.myButt…

EG20网口远程下载程序使用案例

EG20网口远程下载程序使用案例 前言:本文档主要说明了使用蓝蜂虚拟网络工具通过EG20网关的网口(LAN口)远程给PLC下载程序的步骤及其注意事项。使用蓝蜂虚拟网络工具,不仅支持程序的远程下载,同样支持程序的远程上传与…

【Node.js后端架构:MVC模式】基于expres讲解

Node.js后端架构:MVC模式 什么是MVC MVC (Model-View-Controller) 是一种软件设计模式,用于将应用程序的逻辑分离成三个不同的组件:模型、视图和控制器。 模型(Model)负责处理应用程序的数据逻辑。它负责从数据库或其…

JS事件循环详解

前言 进程 程序运行需要其专属的内存空间,可以把这块内存空间简单理解为进程。 下图每个颜色块都可视为一个应用,每个应用至少应有一个进程,进程之间相互独立,即使想要通信,也需要双方同意。 线程 有了进程后&…

二次元检测设备导轨修复指南

二次元检测设备是一种高精度的测量仪器,用于检测物体表面的形状、尺寸和精度等。直线导轨是二次元检测设备中最重要的组成部分之一,它的精度和稳定性直接影响到设备的测量结果和可靠性,因此,对导轨进行修复和保养是非常重要的。 直…

Linux删除了大文件为什么磁盘空间没有释放?

某天,收到监控系统的告警信息,说磁盘空间占用过高,登上服务器,使用 df -h 一看,发现磁盘占用率已经 96%了: 通过查看 /usr/local/nginx/conf/vhost/xxx.conf 找到 access_log 和 error_log 的路径&#x…

SDX12 上层应用gdb调试及环境搭建

SDX12 上层应用gdb调试及环境搭建 1. 问题背景2 环境搭建3 操作步骤4. 调试过程5 实现效果6 附录 1. 问题背景 上层应用在问题定位的过程中,现有手段只能有有限的log打印,通常情况下很难定位问题。如果想在应用程序执行的过程中查看任意调用关系或者数据…