2023-02-22 学习记录--TS-邂逅TS(二)

news/2024/4/27 17:11:17/文章来源:https://blog.csdn.net/weixin_48850734/article/details/129152367

TS-邂逅TS(二)

不积跬步,无以至千里;不积小流,无以成江海。💪🏻

一、接口(interface

在这里插入图片描述

ts 中,子类只能继承一个父类,不可多继承,但是接口可以实现多继承。So,请小萝卜儿们继续往下看哦 👇🏻

  1. 作用 👍🏻:接口是为了实现多继承,接口好比协议,我们签署了协议,就需要实现协议上的内容。
    • 多继承:子类可以继承多个父类,从而同时含有多个类的属性。
  2. 使用 🎀:将需要继承的多个父类用 接口 表示。
  3. 定义接口 🦋:( interface )
    • interface 接口名 { }
  4. 定义继承 父接口子接口 🦋:( extends )【多个父接口用 逗号 隔开】
    • interface 子接口 extends 父接口1, 父接口2 { }
  5. 定义继承 父接口子类 🦋:( implements )【多个父接口用 逗号 隔开】
    • class 子类 implements 父接口1, 父接口2 { }

注意:

  • 1、无论子接口还是父接口,里面的方法都要写成不被实现的,比如:attack();
  • 2、接着在继承接口的子类里必须实现该接口里的方法,比如:attack() { }

在这里插入图片描述

父类:人、狼、猪猪;
子类:狼人;
实现效果:定义一个子类狼人,其既含有人的属性,也含有狼、猪猪的属性。

第一步🪜、定义三个父类(人、狼、猪猪)

// 父类-人
class Person {name: string = "杨咩咩";
}// 父类-狼
// class Wolf {
//   attack() {//   }
// }
// 为了实现多继承,Wolf就不能用类了,而要写成一个接口 👇🏻
// IWolf:命名习惯,前加个I,表示这个是个接口,而不是一个普通的类
interface IWolf {// 注意这里的方法要写成不被实现的attack(): any;
}// 父类-猪猪
// 为了实现多继承,不能用类了,而要写成一个接口 👇🏻
// IPig:命名习惯,前加个I,表示这个是个接口,而不是一个普通的类
interface IPig {// 注意这里的方法要写成不被实现的eat(): any;
}

第二步 🪜、定义一个子类狼人,其既含有人的属性,也含有狼、猪猪的属性

1)、方法一 🍓

直接通过extends继承父类Person,同时通过implements继承父接口IWolfIPig 实现。

// 子类-狼人
// 想实现一个类WolfMan 同时含有Person、Wolf、Pig的特性
// WolfMan是Person的子类,同时还拥有IWolf、IPig的特性
class WolfMan extends Person implements IWolf, IPig {// 必须实现接口里的方法attack() {console.log('attack')}eat() {console.log('eat')}// 构造函数constructor() {super();this.name = "新的杨咩咩";}
}
2)、方法二 🍊

1、先通过extends定义一个接口IChild,其继承IWolfIPig接口;
2、再通过extends继承父类Person,同时通过implements继承接口IChild 实现。

// 定义一个接口IChild,其继承IWolf、IPig接口
// IChild:命名习惯,前加个I,表示这个是个接口,而不是一个普通的类
interface IChild extends IWolf, IPig {// 注意这里的方法要写成不被实现的// cry(): any;
}// 子类-狼人
// 想实现一个类WolfMan 同时含有Person、Wolf、Pig的特性
// WolfMan是Person的子类,同时还拥有IWolf、IPig的特性
class WolfMan extends Person implements IChild {// 必须实现接口里的方法// cry() {//   console.log('cry')// }attack() {console.log('attack')}eat() {console.log('eat')}// 构造函数constructor() {super();this.name = "新的杨咩咩";}
}

二、属性寄存器(getset

  • 取值:get
  • 赋值:set
    在这里插入图片描述

实现不在外部直接修改成员属性_hp

// 类 Person
class Person {// 成员属性_hp: number = 120;// 取值get hp() {return this._hp;}// 赋值set hp(value) {if(value < 0) {this._hp = 0;} else {this._hp = value;}}
}// 外部
// 实例化对象 new一下
let a = new Person();
// 有属性寄存器的情况下,就尽量不要去用成员属性_hp
// 赋值
a.hp -= 100;
// 取值
document.write(a.hp + ""); // 20

三、命名空间(namespace

目的 🌈:解决命名冲突;
使用 📚:在同名类外面包裹一层 namespace 自定义名称 { }
注意 🌩:如果一个类想在名称空间外被使用,需要在类前面加个 export

在这里插入图片描述

// 命名空间:解决命名冲突/** * 举例:假如有两个都叫Person的类,想分别获取到对应类的name值*//** 通过命名空间namespace对类进行区分 */
namespace aa {// 如果一个类想在名称空间外被使用,需要在类前面加个 exportexport class Person {name: string = "111";}
}namespace bb {// 如果一个类想在名称空间外被使用,需要在类前面加个 exportexport class Person {name: string = "222";}
}/** 实例化对象,分别获取到对应类的name值 */ 
let person1 = new aa.Person();
document.write(person1.name); // 111
let person2 = new bb.Person();
document.write(person2.name); // 222

四、泛型

在这里插入图片描述

  • 格式 🏠:<类型>
  • 目的 📚:1、方便管理 (使用泛型后,只用在调用方法或类时修改表明的类型,该方法或类里用到该类型的地方就都被改到了);2、实现类型统一化
    • 可能有爱动脑筋的小萝卜儿想到:类型都传any 就好啦。
    • 这样确实不用区分类型了,But 要注意哦:
      • 比如:function add(num: any): any{ } 都用类型any会导致一个问题,传进的类型是number,但传出的类型是string,达不到类型的统一化哦。
  • 使用 😇 :下面分别对单泛型和多泛型写了对应案例,请往下看哦~ 👇🏻

1、单泛型 ⭐️

/** 单泛型 */
// 1、自定义待传入的类型T(T是随便取的)
// 传进和传出的类型为同类型T,从而实现:传进什么类型,传出的就是什么类型
function add<T>(num: T): T {if(typeof num === 'number') {num++;return num;}return num;
}
// 2、调用方法时要在<>里传入对应类型
// 比如这儿相当于:T对应的是number数值型
document.write(add<number>(3) + ''); // 4
// 比如这儿相当于:T对应的是string字符串型
document.write(add<string>('3') + ''); // 3

2、多泛型 ⭐️

/** 多泛型 */// 1、自定义待传入的类型T、S(T, S就是随便取的)
// 假如想有多个类型,把多个泛型用逗号隔开即可,比如<T,S>
class Person<T,S> {// 成员方法say(num: T) {// document.write()里面只能接字符串型,无论什么类型,只要跟个 + "",就会变成字符串型哦document.write(num + "");}// 成员方法eat(food: S) {// document.write()里面只能接字符串型,无论什么类型,只要跟个 + "",就会变成字符串型哦document.write(food + "");}
}// 2、实例化对象时要在<>里传入对应类型,传入时前后顺序需要一一对应,比如这儿相当于:T对应的是number数值型,S对应的是string字符串型
let a = new Person<number,string>;
a.say(3); // ✅ 3
a.say('3'); // ❎ ('3'下方出现红色波浪线) Error: Argument of type 'string' is not assignable to parameter of type 'number'.
a.eat('棒棒糖'); // ✅ '棒棒糖'
a.eat(0); // ❎ (0下方出现红色波浪线) Error: Argument of type 'number' is not assignable to parameter of type 'string'.

五、元祖(Tuple)、数组(Array)、字典

在这里插入图片描述

  • 1、元祖(Tuple: 一个固定长度合并不同类型数组
    • 语法 🎀 :[类型1, 类型2]
    • 举例 🎀 :const hero: [string, number] = [“超人”,100];
  • 2、数组(Array长度不固定合并相同类型的内容
    • 数组的声明方式有两种 【更多详情可看TS-邂逅TS(一)】:👇🏻
      • 1、类型[],比如 number[] 表示数值型数组,eg. [1,2,3];
      • 2、Array<类型>,比如 Array<number> 表示数值型数组,eg. [1,2,3]。
  • 3、字典

1、元祖(Tuple

// 比如hero是一个元祖类型,里面存了两个数据,一个是字符串类型,一个是数值型
let hero: [string, number] = ["超人",100];
hero[0] = "蝙蝠侠";
document.write(hero[0]); // 蝙蝠侠

2、数组(Array

/* 数组的声明方式有两种:1、类型[],比如 number[] 表示数值型数组,比如[1,2,3]2、Array<类型>,比如 Array<number> 表示数值型数组,比如[1,2,3]
*/
const array1: number[] = [1,2,3];
// 下面的Array是个类,new Array()为一个空数组[]
// 下面的<number>是泛型,限制了数组里面的值类型为number
const array2: Array<number> = new Array<number>();
(一)、数组里添加或删除元素的方法:push()unshift()pop()shift()splice()
const array = [1,2,3];// 1、push() 在数组最后面追加元素(可以追加多个元素)
array.push(4, 5);
console.log(array); // [1, 2, 3, 4, 5]// 2、unshift() 在数组最前面添加元素(可以添加多个元素)
array.unshift(-1, 0);
console.log(array); // [-1, 0, 1, 2, 3, 4, 5]// 3、pop() 删除数组中的最后一个元素
array.pop();
console.log(array); // [-1, 0, 1, 2, 3, 4]// 4、shift() 删除数组中的第一个元素
array.shift();
console.log(array); // [0, 1, 2, 3, 4]// 5、splice() 删除元素/插入元素/替换元素(第一个参数是操作元素的索引值)
// (1)、删除元素:第二个参数传入你要删除几个元素(如果没有传,就删除后面所有的元素)
array.splice(0, 1); // 从第一位开始删除1个元素
console.log(array); // [1, 2, 3, 4]
// (2)、插入元素:第二个参数为0(删除0个),并且第三个参数是表示要插入的元素
array.splice(0, 0, 6); // 在索引值为0的地方插入6
console.log(array); // [6, 1, 2, 3, 4]
// (3)、替换元素:第二个参数,表示我们要替换几个元素,第三个元素是用于替换前面的元素
array.splice(0, 2, 7); // 7替换掉从第一位开始的两个元素
console.log(array); // [7, 2, 3, 4]
(二)、合并数组的方法
/** * 合并两个数组的方法:*  方法1、数组1.concat(数组2);*  方法2、[...数组1,...数组2];
*/ 
const array1 = [2,3];
const array2 = [1,2,3];
// 方法1
const finalArray1 = array1.concat(array2);
console.log(finalArray1); // [2, 3, 1, 2, 3]
// 方法2
const finalArray2 = [...array1,...array2];
console.log(finalArray2); // [2, 3, 1, 2, 3]
(三)、查找数组中元素的位置(索引值):indexOf()
/*** 查找数组中元素的位置(索引值)* 语法: 数组.indexOf(待查找元素);
*/
const array = [1,3,2,3,2];
const index = array.indexOf(3);
console.log(index); // 1
(四)、数组排序:sort()reverse()
/*** 排序* 1、顺序: 数组.sort();* 2、逆序: 数组.reverse();
*/ 
const array = [1,3,2,3,2];
// 顺序
array.sort();
console.log(array); // [1, 2, 2, 3, 3]
// 逆序
array.reverse();
console.log(array); // [3, 3, 2, 2, 1]

3、字典

// ["a","b","c"] => key: value  0: "a" 1: "b" 2: "c"// 字典
let dic: { [key: string]: string } = {"name1": "王小虎","name2": "李逍遥",
};
dic["name3"] = "令狐冲";
document.write(dic["name3"]); // 令狐冲

六、访问修饰符

在这里插入图片描述

  • 共有三个 👇🏻:放在 属性和方法(包括:成员属性、成员方法、构造方法、静态属性、静态方法) 前面,限定属性和方法的访问权限。【默认是public:前面什么也不加 等于 前面加public
      1. public(公开的):完全公开访问,类里的属性和方法在当前类子类外部均可访问;
      1. protected(受保护的):类里的属性和方法在当前类子类可访问,在外部不可访问;
      1. private(私有的):类里的属性和方法在当前类可访问,在子类外部均不可访问。
/** 以public为例 */// 当前类 Person
class Person {// 成员属性【默认是public:前面什么也不加 等于 前面加public】name: string = "小猪";// 成员方法【默认是public:前面什么也不加 等于 前面加public】say() {document.write(this.name);}
}// 子类 Student
class Student extends Person {constructor() {super();this.name = "乔治";this.say(); // 乔治}
}// 外部
let a = new Person(); // 实例化对象
a.name = "佩奇";
a.say(); // 佩奇new Student(); // 实例化对象

上一篇:TS-邂逅TS(一)

今日份TS学习到此结束啦 拜了个拜~

在这里插入图片描述

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

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

相关文章

学习国家颁布的三部信息安全领域法律,理解当前工作中的信息安全合规要求

目录三部信息安全领域的法律文件三部法律的角色定位与联系三部法律的适用范围三部法律的主要履职部门三部法律条文章节结构中的共性三部法律中的一些次重点章节网络安全法的重点章节数据安全法的重点章节个人信息保护法的重点章节关于工业和信息化部行政执法项目清单三部信息安…

ChatGPT这是要抢走我的饭碗?我10年硬件设计都有点慌了

前 言 呃……问个事儿&#xff0c;听说ChatGPT能写电路设计方案了&#xff0c;能取代初级工程师了&#xff1f;那我这工程师的岗位还保得住么&#xff1f;心慌的不行&#xff0c;于是赶紧打开ChatGPT问问它。 嘿&#xff0c;还整的挺客气&#xff0c;快来看看我的职业生涯是否…

非关系型数据库(mongodb)简单使用介绍

关系型数据库与非关系型数据库 关系型数据库有mysql、oracle、db2、sql server等&#xff1b; 关系型数据库特点&#xff1a;关系紧密&#xff0c;由表组成&#xff1b; 优点&#xff1a; 易于维护&#xff0c;都是使用表结构&#xff0c;格式一致&#xff1b; sql语法通用&a…

IP地理位置定位技术原理是什么

IP地理位置定位技术的原理是基于IP地址的网络通信原理和基础上的。它利用IP地址所包含的一些信息&#xff0c;如网络前缀和地址段&#xff0c;以及ISP的IP地址归属地数据库&#xff0c;来推测IP地址所对应的地理位置。具体来说&#xff0c;IP地址是由32位二进制数字组成的&…

《计算机网络:自顶向下方法》实验2:常用网络命令的使用

使用Ping实用程序来测试计算机的网络连通性 登录到Windows中。单击开始,然后将鼠标指针移到程序上,再移到Windows系统,然后单击命令提示符。在命令提示窗口键入ping 127.0.0.1。问题1:发送了多少数据包?接受了多少数据包?丢失了多少数据包? 发送了4个数据包;接受了4个数…

Java集合(二)---Map

1.什么是Hash算法哈希算法是指把任意长度的二进制映射为固定长度的较小的二进制值&#xff0c;这个较小的二进制值叫做哈希值static final int hash(Object key) {int h;return (key null) ? 0 : (h key.hashCode()) ^ (h >>> 16);}以上是HashMap中的hash算法代码2…

机器学习------ 基于ubuntu 22.04 系统下的pytorch 安装记录过程(包含cuda和cudnn的安装)

机器学习----- pytorch的安装过程 最近&#xff0c;在学习机器学习&#xff0c;在对于理论方面进行一段时间的学习后&#xff0c;打算开始上手代码。在此之前&#xff0c;选择了pytorch作为学习的工具&#xff0c;这里记录下安装的过程。在这里&#xff0c;先把我的设备展示一…

java10-异常处理

1.异常处理体系结构 2.从程序执行过程看编译时异常和运行时异常 》编译时异常&#xff1a;执行javac.exe命令时&#xff0c;可能出现的异常 》运行时异常&#xff1a;执行java.exe命令时&#xff0c;出现的异常 3.常见的异常类型&#xff0c;请举例说明&#xff1a; Test …

PCL 平面拟合方法 对比

目录 一、最小二乘法 (Least Squares, LS) 二、采样一致性&#xff08;Sample Consensus&#xff09;方法 2.1 pcl::LeastMedianSquares (LMedS) 2.2 pcl::RandomSampleConsensus (RANSAC) 2.3 pcl::MEstimatorSampleConsensus (MSAC) 2.4 pcl::RandomizedRandomSampleCo…

解决Ubuntu22.04.1上安装ch34x串口驱动报 Key was rejected by service 需要签名的问题

解决Ubuntu22.04.1上安装ch34x串口驱动报 Key was rejected by service 需要签名的问题问题官网下载解压驱动包编译安装给驱动签名再来载入模块&#xff08;设备驱动程序&#xff09;问题 Ubuntu22.04.1 Linux版本5.19.0-32-generic 运行Qt串口通信 m_serialPort->open(QIO…

数组类模板

要求&#xff1a;设计一个数组模板类&#xff08;MyArray&#xff09;&#xff0c;完成对不同类型元素的管理操作步骤设计头文件在 qtcreate下先创建03_code的项目&#xff0c;然后右键点击03_code添加新文件&#xff0c;点击头文件&#xff0c;点击Choose命名为 myarry.hpp&am…

[黑马程序员SSM框架教程]03 spring核心概念

IOC/DI 书写现状&#xff1a;耦合度偏高 如图&#xff1a;传统书写代码左边业务层需要new一个对象进行业务实现。当数据层优化代码BookDaoImpl2就需要动业务层代码重新修改new的对象。导致代码耦合度偏高。 解决办法&#xff1a;使用对象&#xff0c;不要主动new对象&#xff…

设计模式.工厂模式.黑马跟学笔记

设计模式.工厂模式4.创建型模式4.2 工厂模式4.2.1 概述4.2.2 简单工厂模式4.2.2.1 结构4.2.2.2 实现4.2.2.4 优缺点4.2.2.3 扩展4.2.3 工厂方法模式4.2.3.1 概念4.2.3.2 结构4.2.3.3 实现4.2.3.4 优缺点4.2.4 抽象工厂模式4.2.4.1 概念4.2.4.2 结构4.2.4.2 实现4.2.4.3 优缺点4…

关于java8的List的stream流的foreach()方法问题探究(坑)与替代方案

一、起因 今天发现线上系统出现了一个bug&#xff0c; 我有一个“定时任务”每天凌晨触发&#xff0c;任务内容&#xff1a; ① 定时调用的系统暴漏的接口&#xff0c;来定时获取List<Object>数据。 ② 然后我会筛选出该List中符合条件的Object&#xff0c;对筛选出来的…

【Python入门第十五天】Python字典

字典&#xff08;Dictionary&#xff09; 字典是一个无序、可变和有索引的集合。在 Python 中&#xff0c;字典用花括号编写&#xff0c;拥有键和值。 实例 创建并打印字典&#xff1a; thisdict {"brand": "Porsche","model": "911&q…

科技新浪推前浪 ChatGPT将元宇宙“拍在沙滩上”?

近期ChatGPT的热度显然已经盖过了元宇宙&#xff0c;回想去年元宇宙大热之际&#xff0c;很多企业纷纷跟进&#xff0c;甚至还有不少公司选择更名以表达All In元宇宙的决心。而如今ChatGPT抢占风头&#xff0c;成为新宠&#xff0c;元宇宙似乎被“抛弃”了&#xff0c;难道元宇…

【React npm】从零搭建react脚手架,发布组件库到npm,并实现按需加载(二)

发布react组件库前情回顾介绍搭建脚手架配置babelrc配置jsconfig写入组件demo修改主入口文件配置生产环境webpack配置package.json发布实现按需加载前情回顾 前面写过一篇&#xff0c;发布单个组件到npm的&#xff1a; https://blog.csdn.net/tuzi007a/article/details/12911…

【HTML】HTML 表单 ⑤ ( form 表单域 )

文章目录一、form 表单域1、form 表单域作用2、form 表单域语法3、form 表单域 Get 请求4、form 表单域 Post 请求一、form 表单域 1、form 表单域作用 从 input 表单 , textarea 文本域 , select 下拉菜单 中收集了用户信息 , 需要通过 form 表单域 发送给 服务器端 ; 2、fo…

第十一章 - 模糊匹配(like)、正则匹配(REGEXP)、文本处理函数、时间处理函数

第十一章 - 模糊匹配&#xff08;like&#xff09;、正则匹配&#xff08;REGEXP&#xff09;、文本处理函数、时间处理函数模糊匹配和正则匹配like%通配符_通配符REGEXP 正则匹配文本拼接concat&#xff08;&#xff09;substring()substring_index()一些文本处理函数时间处理…

【计算机组成原理】求寻址范围(按字/按字节)

今天一道计算机组成原理的复习题一直没搞懂怎么做的&#xff0c;网上讲解求寻址范围题型的资料和视频也很少&#xff0c;花了半个晚上才搞懂。 首先&#xff0c;理解存储体&#xff0c;存储单元&#xff0c;存储字&#xff0c;存储元。&#xff08;文章末尾详细解释了) 以下是…