TypeScript 从入门到进阶之基础篇(二) ts进阶类型篇

在这里插入图片描述

TypeScript 从入门到进阶系列

  1. TypeScript 从入门到进阶之基础篇(一) ts基础类型篇

文章目录

  • TypeScript 从入门到进阶系列
  • 前言
  • 一、object 类型
      • 1、基础运用
      • 2、可选属性
      • 3、任意属性
      • 4、只读属性 readonly
      • 5、对象中的函数
  • 二、数组类型
      • 1、数组的运用
      • 2、使用接口定义数组
      • 3、arguments类数组
      • 4、对象数组


前言

在上一章我们学习了在TypeScript 中如何使用、定义基础类型,本章我们将对TypeScript 中的 对象 、数组类型进行学习 ,在本章的学习中 你将了解到在TypeScript 使用引用类型与在 JavaScript 使用引用类型的区别及对应TypeScript 的知识


一、object 类型

object 类型相信学过JavaScript 的都了解 , 他是属于引用数据类型,在JavaScript 中的写法如下, 但是在TypeScript 中 我们定义对象的方式要用关键字interface(接口),其作用就是约束对象中的变量要满足其条件,同时 用接口定义对象,在我们使用到此对象的时候,在vscode中会有提示 可以开发时方便一些,以及如果我们在使用对象时如果定义了对象中不存在的属性 将会智能的提示出错误

1、基础运用

//JavaScript 的写法
const obj={
    a:1,
    b:'2',
}
//TypeScript 的写法

//首先我们要定义接口
//注意 我们在定义接口时 必须与对象中的属性一一对应 不能多一个属性也不能少一个属性 且数据的类型要对应
interface Obj {
    a:number
    b:string
}
const obj:Obj={
    a:1,
    b:'2',
}

注意 我们在定义接口时 必须与对象中的属性一一对应 不能多一个属性也不能少一个属性 且数据的类型要对应。例如下面的

错误例子1 :我们在接口定义时 有a b c 3个属性 但是在obj对象中 只有a b 两个属性,这样则不满足一一对应的原则,将会报错

//例子1  将会报错
interface Obj {
    a:number
    b:string
    c:string
}
const obj:Obj={
    a:1,
    b:'2',
}

错误例子2 :在此例子中我们的Obj接口和obj对象都是两个属性一一对应,看起来像没问题是吧。但是在接口的属性中 a属性我们定义为string类型, 但是我们在使用是 obj的a属性 是number类型 1 ,学过第一章的应该了解数据类型不一致的话赋值会报错 使用在此例子中也是会报错的。

//例子2  将会报错
interface Obj {
    a:string
    b:string
}
const obj:Obj={
    a:1,
    b:'2',
}

2、可选属性

在前面的例子我们了解了如何在TypeScript中使用对象类型,在上面的错误例子1中我们定义的接口有3个属性 但是obj中只有两个属性,所以会报错。那么你有没有想过 能不能在接口中定义多一些属性 这些属性我不一定用到 但是我用到的时候之前定义好了可以直接用。那么就涉及到了对象中的可选属性 。

对象中的可选属性的含义是该属性可以不存在,可以看下面的例子obj2中的 c 可以存在 也可以不存在,因为我们在接口定义时在c属性前面加了个 ? 代表这个属性可以不存在

//将会报错
interface Obj {
    a:number
    b:string
    c:string
}
const obj:Obj={
    a:1,
    b:'2',
}
//正确
//对象中的可选属性
interface Obj2 {
    a:number
    b:string
    c?:string
}
 const obj2:Obj2={
    a:1,
    b:'2',
 }  
 
  //如果想用到c属性时 可以这样使用
  //注意 我们在上面定义的c是string类型 所以只能赋值字符串的数据
 obj2.c='哈哈我可以用的'

3、任意属性

大家了解了前面的知识之后会不会觉得 定义接口很麻烦。接下来我们将使用任意属性 来简化我们的接口定义流程。

注意的是,一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它的类型的子集,也就是说 如果我们定义了对象中的属性是string 类型 ,那么就只能是string 类型

对象中的任意属性的定义:[propName: string]:string

propName 这个可以自己命名

第一个string 代表对象的key

最后面的string 代表对象的属性类型

//在下面的例子中 我们没有定义 a b ww d但是不会出现报错
//因为我们在 Obj中定义了所有的对象属性都是string 类型
interface Obj {
   [propName: string]:string
}
//正确使用
const obj:Obj={
    a:'1',
    b:'2',
    ww:'4',
}
//错误使用 因为Obj中的属性都定义是string类型 所以a 的属性是number类型的1则会报错
const obj:Obj={
    a:1,
    b:'2',
    ww:'4',
}

4、只读属性 readonly

接下来的TypeScript 对象中的只读属性 readonly ,只读属性 顾名思义 如果我们使用了readonly 代表只能读取 不能对其进行改变例如下面的例子

//
interface Obj {
    a:string
  readonly b:string
}

const obj:Obj={
    a:'666',
    b:'我是不能改变的 只能读'
}

//如果这样赋值将会报错 因为b是只读属性 不可改变
obj.b='我就想改变'

5、对象中的函数

在TypeScript 中 我们也能在对象中使用属性的 只需要在接口时进行定义 如下:

具体的函数定义及使用我将在下章进行详情讲解

interface Obj {
    a:string
    submit:()=>void
}
    
 const obj:Obj={
     a:'666',
     submit:()=>{
         console.log('函数的定义')
     }
 }
    
 obj.submit()

二、数组类型

在JavaScript 中 数组也是引用类型的一种,在TypeScript 中 我们可以通过多种方式来定义数组的类型。 例如:类型[]、泛型数组、接口定义数组等等。

1、数组的运用

在TypeScript 中 使用数组的时候需要进行定义,我们可以通过 数组名:类型[] 来定义数组,也可以通过数组的泛型来定义 例如: Array<类型> ,详情请看下面例子

//  数组名:类型[] 的用法
let arr:string[]=['前','端','枫']
//注意 当我们指定了类型之后 如果输入的数组类型与我们定义的不一样 将会报错 
//例如下面的错误例子
arr.push(1)//报错 不能在string[]类型的数组中 添加number类型


//数组泛型 其实与上面的意思是一样的 只是写法不同
let arr2:Array<number>=[1,2,3]

2、使用接口定义数组

在TypeScript 中 我们也可以通过接口来定义数组 ,用法与对象定义中的任意属性差不多,其实就是定义一个接口中 key为numbr类型 定义数组下标 value为我们的数组类型

注意: 我们在使用接口定义数组时 [index: number]必须为number 类型

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

//注意 我们在使用接口定义数组时  [index: number]必须为number 类型
let arr:TsArray=[1,2,3]

3、arguments类数组

在 JavaScript 我们有时候会在函数中的参数使用到arguments,那么我们该如何在TypeScript 去使用和定义arguments呢? 其实 TypeScript 已经帮我们内置好了arguments 的类型 IArguments,具体用法如下

const arrFunction =(...args:any)=>{
    //内置对象 IArguments
    let arr:IArguments = arguments
}

4、对象数组

学完了前面的一维数组的使用,接下来 我们来学习一下,项目中经常用到的对象数组的定义。其实 对象数组就是前面知识的汇总 因为会涉及对象和数组

//要在TypeScript中使用对象数组 首先我们要为对象定义一个接口 如下
interface ObjMap{
    id:string
    label:string
}
//接着我们定义对象数组
//这里数组的每一项都是一个对象 所以每一项的类型都是ObjMap
const objList:ObjMap[]=[{id:'1',label:'我是第一项'}]

//当然 你可以结合前面学的内容 来进行扩展
//例如定义可不存在的属性
//多层对象数组
interface ObjMap2{
    id:string
    label:string
    children?:ObjMap2[]
}
const objList2:ObjMap2[]=[{id:'1',label:'我是第一项',children:[{id:'2',label:'我是它儿子'}]}]

最后 TypeScript 从入门到进阶系列的文章 将会在今年快速更新,敬请期待 。
博主微信:

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

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

相关文章

关于标准那些事——第六篇 四象之“玄武”(格式的编排)

两仪生四象——东方青龙&#xff08;木&#xff09;、西方白虎&#xff08;金&#xff09;、南方朱雀&#xff08;火&#xff09;、北方玄武&#xff08;水&#xff09; 分别对应标准编写之四象——层次的编写、要素的编写、要素的表述、格式的编排。 今天来分享一下 格式的编…

Python 标准库中的 csv 包

0. Abstract 官方文档很罗嗦&#xff0c;长篇大论例子少。本文将举例说明 csv 包的用法&#xff0c;然后补充一些必要的说明。 1.0 CSV 文件 CSV(Comma-Separated Values,逗号分隔值)文件是一种常见的以纯文本形式存储数据的文件格式。它使用逗号作为字段之间的分隔符&#…

【Linux】——基本指令(二)

&#x1f497;个人主页&#x1f497; ⭐个人专栏——数据结构学习⭐ &#x1f4ab;点击关注&#x1f929;一起学习C语言&#x1f4af;&#x1f4ab; 目录 导读&#xff1a;1. vim 指令2. head指令3. tail指令4. tree指令5. 输出重定向6. echo指令7. wc指令8. | 字符9. date指令…

CMake入门教程【核心篇】属性管理set_property和get_property

&#x1f608;「CSDN主页」&#xff1a;传送门 &#x1f608;「Bilibil首页」&#xff1a;传送门 &#x1f608;「本文的内容」&#xff1a;CMake入门教程 &#x1f608;「动动你的小手」&#xff1a;点赞&#x1f44d;收藏⭐️评论&#x1f4dd; 文章目录 1.概述2.设置属性 - …

JS中 focus 和 blur 焦点事件

发现的一个小知识点 focus 获取焦点事件 代码如下&#xff1a; <body><input type"text" placeholder"input输入框"><script>let input document.querySelector(input)input.addEventListener(focus, function (e) {e.target.style.…

Java学校教务管理系统源码带微信小程序

运行环境&#xff1a;jdk8mysql5.7IntelliJ IDEAmaven 技术&#xff1a;springbootmybatislayuishirojquery 教务管理系统是一个基于网络的在线管理平台, 帮助学校管理教务系统&#xff0c;用一个帐号解决学校教务教学管理&#xff0c; 灵活的定制符合学校自己实际情况的教务系…

如何理解面向对象的OO设计原则和设计模式?

一、如何理解面向对象的编程原则? 单一职责原则(Single Responsibility Principle) 一个类,应该由一组相关性很高的数据和方法组成。一个类应该仅有一个引起它变化的原因。单一职责最难界定的就是关于“职责”的定义,往往需要丰富的经验和对业务的认知程度,这也更加容易引…

WEB 3D技术 three.js 法向量演示性讲解

本文 我们来说法向 法向 又叫 法向量 就是 我们一个三维物体 顶点垂直于面 的方向 向量 他的作用 用来做光反射 根据光照的方向 根据面进行反射 我们上文写的这个代码 import ./style.css import * as THREE from "three"; import { OrbitControls } from "…

数仓可视化5--superset的部署安装

1、superset简介 Apache Superset 是一个现代的数据探索和可视化平台。它功能强大且十分易用&#xff0c;可对接各种数据源&#xff0c;包括很多现代的大数据分析引擎&#xff0c;拥有丰富的图表展示形式&#xff0c;并且支持自定义仪表盘。 2、安装步骤 2.1、安装Miniconda3 …

GBASE南大通用 ADO.NET EntityFramework 实体框架支持

GBASE南大通用 ADO.NET 驱动支持 EntityFramework 实体框架。 实体框架&#xff0c;可以理解成微软的一个 ORM 产品&#xff0c;用于支持开发人员通过对概 念性应用程序模型编程&#xff08;而不是直接对关系存储架构编程&#xff09;来创建数据访问应 用程序&#xff0c;目…

RedHat8、Centos8无法启动网卡解决方案,网卡未加入托管

只针对部分情况&#xff0c;网卡未加入托管导致 虚拟机开启 ifconfig 没有ens33网卡&#xff0c;无法上网 手动启动网卡提示 Connection ens33 is not available on device ens33 because device is strictly unmanaged使用nmtui配置IP信息&#xff0c;无法启动’ens160’网卡…

LCR 174. 寻找二叉搜索树中的目标节点

解题思路&#xff1a; 二叉搜索树一般采用中序遍历&#xff08;从小到大排列&#xff09;。 class Solution {int res, cnt;public int findTargetNode(TreeNode root, int cnt) {this.cnt cnt;dfs(root);return res;}void dfs(TreeNode root) {if(root null) return;dfs(ro…

jmeter断言-三种

1.响应断言 substring是指包含就行 不用完全相等 2.json断言 3.持续时间断言

基于深度学习的PCB板缺陷检测系统(含UI界面、yolov8、Python代码、数据集)

项目介绍 项目中所用到的算法模型和数据集等信息如下&#xff1a; 算法模型&#xff1a;     yolov8 yolov8主要包含以下几种创新&#xff1a;         1. 添加注意力机制&#xff08;SE、CBAM等&#xff09;         2. 修改可变形卷积&#xff08;DySnake-主干c…

Linux:apache优化(3)—— 页面缓存时间

作用&#xff1a;通过 mod_expires 模块配置 Apache&#xff0c;使网页能在客户端浏览器缓存一段时间&#xff0c;以避免重复请求&#xff0c;减轻服务端工作压力。启用 mod_expires 模块后&#xff0c;会自动生成页面头部信息中的 Expires 标签和 CacheControl 标签&#xff0…

AIGC年度回顾!2024向量数据库是否还是AI发展方向之一?

引言 2023 年&#xff0c;是 AI 技术大爆发的一年&#xff0c;从年初到年末&#xff0c;全球关心技术发展的人们见证了一次次的 AI 技术升级&#xff0c;也逐步加深着对 AGI 发展的畅想。而伴随着生成式人工智能的飞速发展&#xff0c;向量数据库以其独特的技术优势逐渐崭露头角…

char 和 varChar 的区别是什么?

大家好&#xff0c;我是伯约&#xff0c;这篇对大家有帮助的话求一个赞&#xff0c;另外文章末尾放了我从月入7k到现在3W的学习资料&#xff0c;大家可以去领一下&#xff08;无偿&#xff09;。 CHAR 和 VARCHAR 是最常用到的字符串类型&#xff0c;两者的主要区别在于&#x…

案例073:基于微信小程序的智慧旅游平台开发

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

大文件快速传输解决办法汇总

在数据传输普及的当今时代&#xff0c;文件体量也在不断的突破它”大“的上线&#xff0c;很多企业也在面临着这类大文件快速传输的烦恼&#xff0c;而且这里面的“大”可不是一般意义的几M,几G的文件&#xff0c;它有可能上T级甚至是PB级别、TB级别的大文件&#xff0c;或者是…

LINUX加固之命令审计

一、前言 在LINUX安全范畴中&#xff0c;安全溯源也是很重要的一个环节。对主机上所有曾操作过的命令详细信息需要有一份记录保存&#xff0c;当系统遭受破坏或者入侵&#xff0c;拿出这份记录&#xff0c;可以帮助定位一些可疑动作。 很多系统通常都会配置安全堡垒机&#xff…