当前位置: 首页 > news >正文

TypeScript笔记(三)

前言

上一篇文章我们主要介绍了TypeScript的基本类型boolean、number、string、void、null和undefine,还介绍了任意类型any和联合类型,这篇文章我们将会了解对象类型Interface和数组的相关知识。

对象的类型——接口

在TypeScript中,我们使用接口Interface来定义对象的类型。

什么是接口

在面向对象的语言中,接口是一个非常重要的概念,它是对于行为的抽象,具体的行为是需要由类去实现的。在TypeScript中接口是一个非常灵活的概念,除了可用于对类的一部分行为进行抽象外,也可以用于对对象的形状进行描述,这里的形状就可以理解为对象的属性。

一个简单的例子如下:

interface Person {name: string;age: number;
}let tom: Person = {name: "Tom",age: 25
}

在上面的例子中,我们定义来一个接口Person,接着定义了一个变量tom,它的类型是Person,这样就约束了tom的属性必须和接口一致,如果少了或者多了属性都会报错。

interface Person {name: string;age: number;
}let tom: Person = {name: "Tom"
}

其会报错如下

demo.ts:6:5 - error TS2741: Property 'age' is missing in type '{ name: string; }' but required in type 'Person'.

按照规范接口的首字母需要大写,在一些编程语言中会建议在接口名称前加上I的前缀。

可选属性

在其他语言中如果我们需要两个属性内容差不多的两个类型可能必须定义两个不同接口,但是两个类型的内容很类似会重复定义,在TypeScript中通过可选属性可以避免一些重复定义。

interface Person {name: string;age?: number;
}let tom: Person = {name: "Tom"
}let jerry: Person = {name: "Jerry",age: 24
}

从上述例子可以看出可以通过?来设置可选属性,如果一个属性设置为可选属性,那么该属性可以存在也可以不存在。通过可选属性可以设置属性存不存在,但是还是不能添加属性,否则回报错:

interface Person {name: string;age: number;
}let jerry: Person = {name: "Jerry",age: 24,gender: "male"
}

报错如下

Object literal may only specify known properties, and 'gender' does not exist in type 'Person'.

任意属性

有时候我们会希望一个接口允许有任意的属性,可以使用以下方式:

interface Person {name: string;age?: number;[propName: string]: any
}let jerry: Person = {name: "Jerry",gender: "male"
}

上述例子中[propName: string]定义了任意属性取string类型的值,其中需要注意的是,一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它的类型的子集:

interface Person {name: string;age?: number;[propName: string]: string
}let jerry: Person = {name: "Jerry",gender: "male"
}

上述任意属性是string,但是age的属性是number则会报错。

 Property 'age' of type 'number' is not assignable to 'string' index type 'string'.

一个接口中只能定义一个任意属性。如果接口中有多个类型的属性,则可以在任意属性中使用联合类型:

nterface Person {name: string;age?: number;[propName: string]: string | number
}let jerry: Person = {name: "Jerry",age: 25,gender: "male"
}

只读属性

有时候我们希望对象中的一些字段只能在创建的时候被赋值,那么可以用 readonly 定义只读属性:

interface Person {readonly id: number;name: string;age?: number;[propName: string]: string | number
}let jerry: Person = {id: 9527,name: "Jerry",age: 25,gender: "male"
}jerry.id = 213

上例中,使用 readonly 定义的属性 id 初始化后,又被赋值了,所以报错了。

注意,只读的约束存在于第一次给对象赋值的时候,而不是第一次给只读属性赋值的时候:

数组

在TypeScript中,数组类型有很多定义方式,非常灵活。

类型+方括号表示法

最简单的就是使用类型加方括号来表示数组

let numberArray: number[] = [1, 1, 2, 3]

在这种声明方式中不允许出现其他的类型

数组泛型

我们也可以使用数组泛型来表示数组:

let numberArray: Array<number> = [1, 2, 3, 4, 5]

用接口表示数组

interface Number {[index: number]: number;
}

NumberArray 表示:只要索引的类型是数字时,那么值的类型必须是数字。虽然接口也可以用来描述数组,但是我们一般不会这么做,因为这种方式比前两种方式复杂多了。

类数组

类数组不是数组类型,比如arguments

function sum() {let args: number[] = arguments
}

以上回报错如下

Type 'IArguments' is missing the following properties from type 'number[]': pop, push, concat, join, and 15 more.

上例中,arguments 实际上是一个类数组,不能用普通的数组的方式来描述,而应该用接口:

function sum() {let args: {[index: number]: number;length: number;callee: Function;} = arguments
}

在这个例子中,我们除了约束当索引的类型是数字时,值的类型必须是数字之外,也约束了它还有 length 和 callee 两个属性,事实上常用的类数组都有自己的接口定义,如 IArguments, NodeList, HTMLCollection 等:

function sum() {let args: IArguments = arguments;
}

其中 IArguments是 TypeScript 中定义好了的内置对象,它实际的定义如下,关于内置对象的内容之后会详细介绍。

interface IArguments {[index: number]: any;length: number;callee: Function;
}

any在数组中的使用

一个比较常见的做法是,用 any 表示数组中允许出现任意类型:

let list: any[] = ['xcatliu', 25, { website: 'http://xcatliu.com' }];

最后

这篇文章主要介绍了接口和数组的相关内容,更多文章可以关注公众号QStack。

相关文章:

TypeScript笔记(三)

前言 上一篇文章我们主要介绍了TypeScript的基本类型boolean、number、string、void、null和undefine&#xff0c;还介绍了任意类型any和联合类型&#xff0c;这篇文章我们将会了解对象类型Interface和数组的相关知识。 对象的类型——接口 在TypeScript中&#xff0c;我们使…...

C++(41)-低版本升级到VS2019项目时遇到的问题(2)

1.错误码&#xff1a;MSB8066 代码为3 QT 项目老版本升级到新版本造成的&#xff0c; 1.重新加载项目&#xff1a; 扩展->QT VS tools->Open QT project files-> 2.添加QT模块&#xff1a;QT Project-Settings -> QT Modules2.无法打开QT的头文件 3.…...

git 实战应用

基本使用1.1、使用git想要让 git 对一个目录进行版本控制需要一下步骤&#xff1a;进入要管理的文件夹执行初始化命令git init查看目录下的文件状态git status管理指定文件// 添加指定文件 git add ***.txt// 添加未被管理的所有文件 git add .生成版本git commit -m 描述信息提…...

Linux重启命令shutdown与reboot

在linux命令中reboot是重新启动&#xff0c;shutdown -r now是立即停止然后重新启动&#xff0c;都说他们两个是一样的&#xff0c;其实是有一定的区别的。 shutdown 命令可以安全地关闭或重启Linux系统&#xff0c;它在系统关闭之前给系统上的所有登录用户提示一条警告信息。…...

华为OD机试真题 用 C++ 实现 - 静态扫描最优成本

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…...

拿下宁王、迪王的湖南裕能,还能“狂飙”多远?

文|智能相对论作者|Kinki近日&#xff0c;磷酸铁锂正极材料龙头湖南裕能正式登陆A股&#xff0c;上市当天市值超过了400亿元&#xff0c;投资者中一签可赚1.49万元&#xff0c;可谓近年低迷的资本市场中一支“大肉签”。不过在 “开门红”之后&#xff0c;湖南裕能的股价便一路…...

STM32FreeRTOS - 按键实现任务挂起和恢复

STM32f103C8T6 FreeRTOS - 按键实现任务挂起和恢复&#xff0c;按键按下时&#xff0c;LED任务执行&#xff0c;led闪烁&#xff0c;当led任务挂起&#xff0c;Led停止闪烁。1.STM32CubeMX 创建任务1.1配置GPIO按键配置外部中断触发GPIO绿灯&#xff0c;红灯配置输出模式1.2配置…...

华为OD机试真题Python实现【判断牌型】真题+解题思路+代码(20222023)

判断牌型 题目 五张牌每张牌由牌大小和花色组成 牌大小2~10 J Q K A 花色四种 红桃 黑桃 梅花 方块 四种花色之一 判断牌型 牌型一 同花顺 同一花色的顺子 如红桃 2 红桃 3 红桃 4 红桃 5 红桃 6牌型二 四条 四张相同数字+单张 红桃 A 黑桃 A 梅花 A 方块 A 加黑桃 A牌型三 葫…...

Kafka(7):生产者详解

1 消息发送 1.1 Kafka Java客户端数据生产流程解析 1 首先要构造一个 ProducerRecord 对象,该对象可以声明主题Topic、分区Partition、键 Key以及值 Value,主题和值是必须要声明的,分区和键可以不用指定。 2 调用send() 方法进行消息发送。 3 因为消息要到网络上进行传输…...

FPGA纯verilog代码实现H.264/AVC视频解码,提供工程源码和技术支持

目录1、前言2、硬件H.264/AVC视频解码优势3、vivado工程设计架构4、代码架构分析5、vivado仿真6、福利&#xff1a;工程代码的获取1、前言 本设计是一种verilog代码实现的低功耗H.264/AVC解码器(baseline )&#xff0c;硬件ASIC设计&#xff0c;不使用任何GPP/DSP等内核&#…...

通俗神经网络

经典的全连接神经网络 经典的全连接神经网络来包含四层网络&#xff1a;输入层、两个隐含层和输出层&#xff0c;将手写数字识别任务通过全连接神经网络表示&#xff0c;如 图3 所示。 图3&#xff1a;手写数字识别任务的全连接神经网络结构输入层&#xff1a;将数据输入给神经…...

网络工程(一) 简单的配置

网络工程 简单的配置 需求 两台交换机 两台路由器 两台PC AR1配置静态路由 system-view [HUAWEI]sysname ar1 [ar1]interface g 0/0/0 [ar1-G…0/0/0]ip address 192.168.2.1 24 [ar1-G…0/0/0]quit [ar1]interface g 0/0/1 [ar1-G…0/0/1]ip address 192.168.3.1 24 [ar1-G…...

深度剖析数据在内存中的存储(上)

目录 1. 数据类型介绍 1.1 类型的基本归类 2. 整形在内存中的存储 2.1 原码、反码、补码 2.2 大小端介绍 2.3 一道小题 本章重点 1. 数据类型详细介绍 2. 整形在内存中的存储&#xff1a;原码、反码、补码 3. 大小端字节序介绍及判断 4. 浮点型在内存中的存储解析 正文…...

CF Edu 130 A-D vp 补题

CF Edu 130 A-D vp 补题 数模也是终于结束了。开始恢复vp。今天这场vp发挥比上次好一些&#xff0c;三题rank3600。A&#xff0c;B题做的很顺利。C题标记没弄全多WA了两发。D题是个交互题&#xff0c;也是研究了一下。基本思路正确。 题目链接 A. Parkway Walk 贪心 题意&am…...

4707: 统计数字个数

描述给定一个非负整数a&#xff0c;求其中含有数字b的个数&#xff08;0<a<2147483647&#xff0c;0<b<9&#xff09;。如100001中含所有0的个数为4&#xff0c;1的个数为2。输入输入数据有多组&#xff0c;每组一行&#xff0c;每行为两个整数&#xff0c;即a和b&…...

ChatGPT 编写模式:如何高效地将思维框架赋予 AI ?

如何理解 Prompt &#xff1f;Prompt Enginneeringprompt 通常指的是一个输入的文本段落或短语&#xff0c;作为生成模型输出的起点或引导。prompt 可以是一个问题、一段文字描述、一段对话或任何形式的文本输入&#xff0c;模型会基于 prompt 所提供的上下文和语义信息&#x…...

Leetcode力扣秋招刷题路-0099

从0开始的秋招刷题路&#xff0c;记录下所刷每道题的题解&#xff0c;帮助自己回顾总结 99. 恢复二叉搜索树 给你二叉搜索树的根节点 root &#xff0c;该树中的 恰好 两个节点的值被错误地交换。请在不改变其结构的情况下&#xff0c;恢复这棵树 。 示例 1&#xff1a; 输入…...

消费升级趋势下,平台如何在广告电商模式中攫取新流量

如今电商平台飞速发展&#xff0c;越来越多的人加入电商运营的行列&#xff0c;同行竞争逐渐变得激烈起来&#xff0c;为了能够让平台有更多的展现机会&#xff0c;提升平台的商品转化率&#xff0c;大家都很重视平台的优化&#xff0c;因为一个好的平台可以给自身带来更多的流…...

华为OD机试真题 用 C++ 实现 - 众数和中位数 | 多看题,提高通过率

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…...

Linux NOR 开发指南

Linux NOR 开发指南 1 简介 编写目的 此文档描述Sunxi NOR 模块的使用方法&#xff0c;为相关人员调试提供指导 适用范围 boot0: 适用于brandy-2.0u-boot: 适用于u-boot-2018kernel: 适用于linux-4.9/linux-5.4 内核 BSP 的开发人员、测试人员 2 模块介绍 2.1 模块功能…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...