停止在 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 类型定义的变量和对象的类型检查。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

git基本概念

一、版本控制概念 1.1 什么是版本控制 1.1.1 手动管理文件版本 1.1.2 版本控制软件 概念:版本控制软件是一个用来记录文件发生的变化,以便将来查阅特定版本修订情况的系统,有时也叫“版本控制系统”。通俗的理解就是把手工管理文件版本的方…

TZOJ 1420 手机短号

答案&#xff1a; #include <stdio.h> #include <string.h> int main() {int n 0;scanf("%d", &n);while (n--) //输入n次{char phone[12];scanf("%s", phone);printf("6%s\n", phone 6); //跳过数组前6个元素&#…

【ONNX】多个ONNX 模型合并为一个模型

ONNX 模型直接合并&#xff0c;输入和输出不一致也可以&#xff0c;各自输入输出各自的 示例代码 import onnxruntime# version : 1.16.0 import onnxdef log_model(model):model_1_outs {o.name for o in model.graph.output}model_1_ins {i.name for i in model.graph.in…

15.oracle的 listagg() WITHIN GROUP () 行转列函数使用

1.使用条件查询 查询部门为20的员工列表 -- 查询部门为20的员工列表 SELECT t.DEPTNO,t.ENAME FROM SCOTT.EMP t where t.DEPTNO 20 ; 效果&#xff1a; 2.使用 listagg() WITHIN GROUP () 将多行合并成一行(比较常用) SELECT T .DEPTNO, listagg (T .ENAME, ,) WIT…

深入理解前端路由:构建现代 Web 应用的基石(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

高精度电压源的作用有哪些

高精度电压源是一种能够产生高精度、高稳定性、低噪声的电压信号的设备。其主要作用是提供准确的电压参考信号&#xff0c;以满足各种测试、校准、研发和生产应用的需求。下面安泰电子将详细介绍高精度电压源的作用。 高精度电压源在测量和控制中具有非常重要的作用。在各种物理…

mybatis数据输入-Map类型参数输入

1、建库建表 CREATE DATABASE mybatis-example;USE mybatis-example;CREATE TABLE t_emp(emp_id INT AUTO_INCREMENT,emp_name CHAR(100),emp_salary DOUBLE(10,5),PRIMARY KEY(emp_id) );INSERT INTO t_emp(emp_name,emp_salary) VALUES("tom",200.33); INSERT INTO…

rust持续学习 COW

COW我第一次看见还以为是奶牛 很奇怪是个啥 后来了解到是clone on write 缩写的&#xff0c;大乌龙啊 这个有两种enum,一种是borrow&#xff0c;一种是own rust中&#xff0c;数据读写经常涉及到所有权 这个borrow&#xff0c;很显然&#xff0c;就是不可变借用了 own就是可以写…

深入理解Zookeeper系列-1.初识Zoookeeper

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码、Kafka原理、分布式技术原理&#x1f525;如果感觉博主的文章还不错的话&#xff…

Windows安装Mysql Workbench及常用操作

Mysql Workbench是mysql自带的可视化操作界面&#xff0c;功能是强大的&#xff0c;但界面和navicat比&#xff0c;就是觉得别扭&#xff0c;但其实用惯了也还好&#xff0c;各有特色吧。这里记录一下常用的操作。 官方手册&#xff1a;MySQL Workbench 一、安装 1. 下载 官方…

密码学概论之基本概念

本人信息安全专业&#xff0c;大三&#xff0c;为着将来考研做准备&#xff0c;打算按照自己目前的理解给大家唠唠密码学。 这个专栏我将从以下七个章节来聊聊密码学&#xff0c;若有不当之处&#xff0c;敬请指出。 • 密码学概论 • 流密码 • 分组密码 • 公钥密码 •…

【蓝桥杯软件赛 零基础备赛20周】第5周——高精度大数运算与队列

文章目录 1. 数组的应用–高精度大数运算1.1 Java和Python计算大数1.2 C/C高精度计算大数1.2.1 高精度加法1.2.2 高精度减法 2. 队列2.1 手写队列2.1.1 C/C手写队列2.1.2 Java手写队列2.1.3 Python手写队列 2.2 C STL队列queue2.3 Java队列Queue2.4 Python队列Queue和deque2.5 …

黑马一站制造数仓实战1

1. 项目目标 一站制造 企业中项目开发的落地&#xff1a;代码开发 代码开发&#xff1a;SQL【DSL SQL】 SparkCore SparkSQL 数仓的一些实际应用&#xff1a;分层体系、建模实现 2. 内容目标 项目业务介绍&#xff1a;背景、需求 项目技术架构&#xff1a;选型、架构 项目环境…

《opencv实用探索·六》简单理解图像膨胀

1、图像膨胀原理简单理解 膨胀是形态学最基本的操作&#xff0c;都是针对白色部分&#xff08;高亮部分&#xff09;而言的。膨胀就是使图像中高亮部分扩张&#xff0c;效果图拥有比原图更大的高亮区域。 2、图像膨胀的作用 注意一般情况下图像膨胀和腐蚀是联合使用的。 &…

SpringBoot3.x + mp代码生成器(更新系列)

小伙伴们&#xff0c;有没有这样一个体验&#xff0c;每次开始写一个项目时&#xff0c;搭建项目环境&#xff0c;建entity&#xff0c;mapper&#xff0c;service&#xff0c;controller层文件的感到繁琐&#xff0c;这属实体力活呀&#xff01;然而&#xff0c;自从有了Mybat…

STM32F407-14.3.9-01输出比较模式

输出比较模式 此功能用于控制输出波形&#xff0c;或指示已经过某一时间段。 当捕获/比较寄存器与计数器之间相匹配时&#xff0c;输出比较功能&#xff1a; ● 将为相应的输出引脚分配一个可编程值&#xff0c;该值由输出比较模式&#xff08;TIMx_CCMRx 寄存器中的 OCxM⑦…

基于WebSocket实现客户聊天室

目录 一、实现聊天室原理 二、聊天室前端代码 三、聊天室后端代码&#xff08;重点&#xff09; 四、聊天室实现效果展示 一、实现聊天室原理 1.1 介绍websocket协议 websocket是一种通信协议&#xff0c;再通过websocket实现弹幕聊天室时候&#xff0c;实现原理是客户端首…

《功能磁共振多变量模式分析中空间分辨率对解码精度的影响》论文阅读

《The effect of spatial resolution on decoding accuracy in fMRI multivariate pattern analysis》 文章目录 一、简介论文的基本信息摘要 二、论文主要内容语音刺激的解码任务多变量模式分析&#xff08;MVPA&#xff09;K空间 空间分辨率和平滑对MVPA的影响平滑的具体过程…

刷题笔记12.01 贪心策略

P1090 [NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 说最大不超过.不用高精度,好说 #include <bits/stdc.h> using namespace std; int n,n2,a; long long a1[10004],a2[10004],sum; int main() {ios::sync_…

【科技素养】蓝桥杯STEMA 科技素养组模拟练习试卷14

单选题 1、下列现象中有化学变化发生的是 A、蜡烛融化 B、冰块融化 C、电磁炉烧开水 D、铁生锈 答案&#xff1a;D 2、把左边的图形用剪刀剪开&#xff0c;拼成右边的正方形&#xff0c;至少剪几刀 A、1 B、2 C、3 D、4 答案&#xff1a;B 3、能够检验土壤中有沙和粘…