TypeScript学习笔记(三) 数组

大家好,我是半虹,这篇文章来讲 TypeScript 中的数组以及元组类型


1、概述

在 JavaScript 中的数组,在 TypeScript 里,可具体分为数组以及元组两种类型

先来简单对比一下区别

  • JavaScript 中的数组,可以用于存放类型不同数量不定的元素
  • TypeScript 中的数组,通常用于存放类型相同数量不定的元素
  • TypeScript 中的元组,通常用于存放类型不同数量确定的元素

下面我们再来详细介绍  TypeScript  中数组以及元组的相关概念和使用


2、数组

(1)特征

TypeScript 中的数组本质上也是特殊的对象,这与 JavaScript 中的数组是一样的

除此之外,TypeScript 中的数组有两个关键的特征

  1. 元素类型必须相同【重要】
  2. 元素数量可以改变【重要】

这些特征决定着 TypeScript 数组的使用场景


(2)声明

显式声明数组类型写法有二:

  1. 类型后加方括号 []
  2. 泛型,这里只介绍写法,关于泛型的详细说明,后面会写一篇文章单独介绍
// 写法一:类型后加方括号
// 情况一:普通类型
let arr1:number[] = [1, 2, 3];// 写法一:类型后加方括号
// 情况二:复杂类型
let arr2:(number|string)[] = [1, '2', 3];// 写法一:类型后加方括号
// 情况三:多维数组
let arr3:(number|string)[][] = [[1], ['2', 3]];// 写法二:泛型
// 情况一:普通类型
let arr4:Array<number> = [1, 2, 3];// 写法二:泛型
// 情况二:复杂类型
let arr5:Array<number|string> = [1, '2', 3];// 写法三:泛型
// 情况三:多维数组
let arr6:Array<Array<number|string>> = [[1], ['2', 3]];// 验证二:元素数量可以改变arr1.pop();      // 编译正常
arr1.push(4);    // 编译正常// 验证一:元素类型必须相同arr1.push('56'); // 编译报错
arr1.push(true); // 编译报错

如果没有显式声明就会进行隐式推导

let arr0 = [];              // 此时推断为:never[]
let arr1 = [1, 2, 3];       // 此时推断为:number[]
let arr2 = [1, '2', 3];     // 此时推断为:(number|string)[]
let arr3 = [[1], ['2', 3]]; // 此时推断为:(number|string)[][]arr1.push('1'); // 编译报错
arr0.push('1'); // 只是语法提示错误,但是编译没有报错?

(3)只读数组

如果想要声明一个只读数组,你可能会第一时间想到使用  const  关键字

但是就和对象一样,使用  const  只是不能重新赋值,但仍可以修改元素,不是真正意义上的只读

const arr0:number[] = [1, 2, 3];// 删、增、改,都可执行
// 但重新赋值,不被允许arr0.pop();   // 编译正常
arr0.push(4); // 编译正常
arr0[0] = 0;  // 编译正常arr0 = [1, 3, 5]; // 编译报错

想要实现真正意义上的只读,可以使用 readonly 关键字或特殊泛型 Readonly / ReadonlyArray

// 声明只读数组:使用 readonly 关键字,注意 readonly 关键字不能和泛型一起使用const arr1:readonly number[] = [1, 2, 3];arr1.pop();   // 编译报错
arr1.push(4); // 编译报错
arr1[0] = 0;  // 编译报错// 声明只读数组:使用 Readonly 或 ReadonlyArray 泛型const arr2:Readonly<number[]> = [1, 2, 3];
const arr3:Readonly<Array<number>> = [1, 2, 3];const arr4:ReadonlyArray<number> = [1, 2, 3];

实际上,只读数组没有 poppush 等修改元素的方法,因此可进行的操作是普通数组操作的子集

【引理】由于子类型会在继承父类型的基础上增加自己的方法

【推论】也就是说,普通数组是只读数组的子类型,只读数组是普通数组的父类型

【引理】由于任何能使用父类型的地方都可以使用子类型代替,但反之不行

【推论】所以只读数组无法代替普通数组直接使用

想要解决这一问题,可以用类型断言,告诉编译器某个值确实就是某种类型

function sumArr(arr: number[]) {return arr.reduce((prev, curr) => prev + curr);
}// 普通数组
const arr1:number[] = [1, 2, 3];
sumArr(arr1); // 编译正常// 只读数组
const arr2:readonly number[] = [1, 2, 3];
sumArr(arr2); // 编译报错
sumArr(arr2 as number[]); // 类型断言,编译正常

3、元组

(1)特征

元组本质上就是特殊的数组,可以看作是数组的子类型

元组关键的特征也是有两个,正好与数组相反:

  • 元素类型可以不同,但在声明时需要指定【重要】
  • 元素数量无法改变,也在声明时就要指定【重要】

这些不同的特征决定着二者有不同的应用场景


(2)声明

元组类型必须显式声明,因为元组的赋值语法和数组赋值一模一样

并且就像上面说的那样,声明元组时需要单独为每个元素指定类型

// 显式声明时:
// 若是成员的类型写在方括号之外,则说明是数组类型
// 若是成员的类型写在方括号之内,则说明是元组类型【重要,注意区别】// 声明元组
// 单一类型,数量为三
let tuple1:[number, number, number] = [1, 2, 3];   // 赋值的语法,数组和元组一样// 声明元组
// 不同类型,数量为三
let tuple2:[number, string, number] = [1, '2', 3]; // 赋值的语法,数组和元组一样

如果没有进行显式声明,那么就会被默认推导为数组

let arr1 = [1, 2, 3]; // 这个语句在介绍数组时已经出现过

(3)可选元素

就和对象类型一样,元组类型同样支持可选元素,这样赋值时该元素就可以被忽略不算

只需声明元组类型时在该元素后面加上问号即可,但要注意可选元素要在必选元素之后

// 声明时
let tuple1:[number?, string]; // 编译报错,可选元素要在必选元素之后
let tuple2:[number, string?]; // 编译正常// 赋值时
tuple2 = [1, '2']; // 可选元素既能赋值
tuple2 = [1];      // 也能省略

元组中的元素数量通常在声明时就能确定具体值,但是使用可选元素之后就没这么简单了

编译器在进行访问检查时会认为:所有可能的元素数量都是合法的

// 声明时
let tuple2:[number, string?] = [1];// 访问时
tuple2[0]; // 编译正常(元素数量有可能是 1,当可选元素被赋值时),运行时访问结果也符合预期,为 1
tuple2[1]; // 编译正常(元素数量有可能是 2,当可选元素被忽略时),运行时访问结果不符合预期,为 undefined
tuple2[2]; // 编译报错(元素数量不可能是 3)

(4)剩余元素

元组类型支持剩余元素,表示可以接收任意多个指定类型的元素

声明时可以在任意位置,使用拓展运算符来展开一个数组或元组

// 剩余元素放在最后,拓展运算符 (...) 后面是布尔类型数组
let tuple1:[number, string, ...boolean[]];// 剩余元素放在中间,拓展运算符 (...) 后面是布尔类型数组
let tuple2:[number, ...boolean[], string];// 剩余元素放在最前,拓展运算符 (...) 后面是布尔类型数组
let tuple3:[...boolean[], number, string];// 赋值
tuple1 = [1, '2'];              // 剩余元素赋予零个值也行
tuple1 = [1, '2', true];        // 剩余元素赋予一个值也行
tuple1 = [1, '2', true, false]; // 剩余元素赋予两个值也行// 使用场景,如:
// 指定一个至少接收一个字符串的元组
let tuple4:[string, ...string[]];

(5)只读元组

最后再来介绍只读元组,就和数组一样,const 关键字无法做到真正意义上的只读

正确的做法是使用 readonly 关键字或特殊泛型 Readonly

// 声明只读元组:使用 readonly 关键字
let tuple1:readonly [number, string];// 声明只读元组:使用 Readonly 泛型
let tuple2:Readonly<[number, string]>;


好啦,本文到此结束,感谢您的阅读!

如果你觉得这篇文章有需要修改完善的地方,欢迎在评论区留下你宝贵的意见或者建议

如果你觉得这篇文章还不错的话,欢迎点赞、收藏、关注,你的支持是对我最大的鼓励 (/ω\)

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

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

相关文章

《视觉十四讲》例程运行记录(3)——运行ch6的例程中Ceres和g2o库的安装

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、安装Ceres1. 安装依赖2. 编译安装 二、安装g2o1. 安装依赖项2. 编译安装3. 可能出现的报错(1) 报错一 一、安装Ceres 1. 安装依赖 终端输入&#xff1a; sud…

计算有效声压

计算有效声压 clear all; %%----------------------------------------------读取文件------------------------------------------ % 从wav文件读入语音数据&#xff0c;该语音采样率16k&#xff0c;故信号最高频率8k。 [x,fs]audioread(C2_3_y.wav); % 取x的一个通道 xx(:,1)…

Google准备好了吗?OpenAI发布ChatGPT驱动搜索引擎|TodayAI

在科技界波澜壮阔的发展中&#xff0c;OpenAI正式宣布其最新突破——一个全新的基于ChatGPT技术的搜索引擎&#xff0c;旨在直接挑战谷歌在搜索领域的统治地位。这一创新将可能彻底改变用户上网搜索的方式。 据悉&#xff0c;这款AI驱动的搜索引擎利用了ChatGPT的强大功能&…

免费SSL证书?轻松申请攻略来了!

在当今的互联网时代&#xff0c;网络安全已经成为一个不容忽视的重要课题。随着在线交流和交易活动的增加&#xff0c;保护网站和用户信息的重要性日益突显。SSL证书&#xff0c;即安全套接字层证书&#xff0c;它为互联网通信提供了加密服务&#xff0c;确保数据的安全性和完整…

淘宝扭蛋机小程序开发:转动幸运,开启无限惊喜

一、探索未知&#xff0c;开启全新扭蛋体验 淘宝扭蛋机小程序&#xff0c;为您带来一场前所未有的扭蛋盛宴。在这个充满神秘与乐趣的平台上&#xff0c;每一次点击都将引领您走进未知的宝藏世界&#xff0c;每一次旋转都可能揭示出意想不到的惊喜。 二、海量商品&#xff0c;…

Kubernetes 教程:在 Containerd 容器中使用 GPU

原文链接:Kubernetes 教程:在 Containerd 容器中使用 GPU 云原生实验室本文介绍了如何在使用 Containerd 作为运行时的 Kubernetes 集群中使用 GPU 资源。https://fuckcloudnative.io/posts/add-nvidia-gpu-support-to-k8s-with-containerd/ 前两天闹得沸沸扬扬的事件不知道…

3D 交互展示该怎么做?

在博维数孪&#xff08;Bowell&#xff09;平台制作3D交互展示的流程相对简单&#xff0c;主要分为以下几个步骤&#xff1a; 1、准备3D模型&#xff1a;首先&#xff0c;你需要有一个3D模型。如果你有3D建模的经验&#xff0c;可以使用3ds Max或Blender等软件自行创建。如果没…

护眼台灯十大品牌哪个好?热销榜护眼灯十大品牌推荐

护眼台灯十大品牌哪个好&#xff1f;在这篇文章中&#xff0c;我将向大家介绍十大护眼台灯品牌&#xff0c;其中包括书客、松下、飞利浦等知名品牌。我精心挑选这些品牌&#xff0c;旨在为大家提供明智的选择参考。这些品牌的护眼台灯拥有的功能比较多&#xff0c;提供的光线也…

揭秘软胶囊品质的秘密武器:西奥机电CHT-01软胶囊弹性硬度测试仪

揭秘软胶囊品质的秘密武器&#xff1a;西奥机电CHT-01软胶囊弹性硬度测试仪 在医药行业中&#xff0c;软胶囊作为一种常见的药品剂型&#xff0c;因其独特的封装方式和便利性而受到广泛青睐。然而&#xff0c;软胶囊的质量问题也一直是制药企业关注的焦点。为了确保软胶囊的质量…

国际数字影像产业园专场招聘会暨四川城市职业学院双选会成功举办

为了进一步强化校企合作&#xff0c;链接企业与高素质人才&#xff0c;促进毕业生实现高质量就业&#xff0c;2024年5月7日&#xff0c;“成就梦想 职通未来”国际数字影像产业园专场招聘会暨四川城市职业学院2024届毕业生校园双选会成功举行。 当天&#xff0c;国际数字影像产…

全国首创!成都代表:国际数字影像产业园运营中

国际数字影像产业园&#xff0c;这座充满活力和创意的产业园区&#xff0c;以其独特的“数字影像文创”新型发展模式&#xff0c;正逐渐成为成都文创产业的标杆。它不仅仅是一个简单的成都文创产业园区&#xff0c;更是一个将数字影像、文化演艺、会展节庆、数字产业、艺术培训…

适用于 iPhone 的最佳数据恢复应用程序

意外删除了重要iPhone文件&#xff0c;或尝试从损坏的手机访问文件&#xff1f;我们收集了适用于 iPhone 的最佳数据恢复应用程序&#xff0c;这可能会扭转局面。 iPhone 数据恢复应用程序是一种您希望永远不需要的工具&#xff0c;但如果您需要的话&#xff0c;您一定会很高兴…

【编码利器 —— BaiduComate】

目录 1. 智能编码助手介绍 2. 场景需求 3. 功能体验 3.1指令功能 3.2插件用法 3.3知识用法 3.4自定义配置 4. 试用感受 5. AI编程应用 6.总结 智能编码助手是当下人工智能技术在编程领域的一项重要应用。Baidu Comate智能编码助手作为一款具有强大功能和智能特性的工…

计算机系列之算法分析与设计

21、算法分析与设计 算法是对特定问题求解步骤的一种描述。它是指令的有限序列&#xff0c;其中每一条指令标识一个或多个操作。 它具有有穷性、确定性&#xff08;含义确定、输入输出确定&#xff0c;相同输入相同输出&#xff1b;执行路径唯一&#xff09;、可行性、输入&a…

链表经典面试题01

目录 引言 面试题01:返回倒数第k个节点 题目描述: 思路分析: 代码展示: 面试题02:链表的回文结构 题目描述: 描述 思路分析: 代码展示: 面试题03:相交链表 题目描述: 思路分析: 代码展示: 小结: 引言 这次的题均来自力扣和牛客有关链表的经典面试题,代码只会展示…

C++从入门到精通——类的6个默认成员函数之拷贝构造函数

拷贝构造函数 前言一、拷贝构造函数概念理解定义 二、拷贝构造函数的特征三、注意要点写法实践传址返回与引用返回的区别传址返回引用返回 传值返回和传址返回的对比总结测试 前言 类的6个默认成员函数&#xff1a;如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中…

抢占用户|AI助力企业高效挖掘潜在客户,推动高质量转化

随着人工智能&#xff08;AI&#xff09;技术的崛起&#xff0c;企业终于可以在这个数字化时代获得一种强大的工具&#xff0c;帮助企业迅速而准确地找到潜在客户。AI不仅能够处理海量的数据&#xff0c;还能自动分析和识别潜在客户的特征和行为模式&#xff0c;为企业营销提供…

【WEEK11】 【DAY1】Employee Management System Part 2【English Version】

2024.5.6 Monday Continuing from 【WEEK10】 【DAY2】Employee Management System Part 1【English Version】 Contents 10.3. Page Internationalization10.3.1. Preparation10.3.2. Configuration File Writing10.3.2.1. Create an i18n (abbreviation for internationaliza…

专业的保密网文件导入导出系统,让文件流转行为更可控安全

军工单位因其涉及国防安全和军事机密&#xff0c;对保密工作有极高的要求&#xff0c;通常会采取严格的网络隔离措施来保护敏感信息和提高网络安全性。常见的方式是通过物理隔离将网络彻底分隔开来&#xff0c;比如保密网和非保密网。网络隔离后&#xff0c;仍有数据交换的需求…

GORM的常见命令

文章目录 一、什么是GORM&#xff1f;二、GORM连接mysql以及AutoMigrate创建表三、查询1、检索此对象是否存在于数据库&#xff08;First,Take,Last方法&#xff09;2、Find()方法检索3、根据指定字段查询 四、更新1、Save() 保存多个字段2、更新单个字段 五、删除 一、什么是G…