两小时快速入门 TypeScript 基础(二)面向对象

个人简介

👀个人主页: 前端杂货铺
🙋‍♂️学习方向: 主攻前端方向,也会涉及到服务端(Node.js 等)
📃个人状态: 2023届本科毕业生,已拿多个前端 offer(秋招)
🚀未来打算: 为中国的工业软件事业效力 n 年
🥇推荐学习:🍍前端面试宝典 🍉Vue2 🍋Vue3 🍓Vue2/3项目实战 🥝Node.js🍒Three.js 🍖JS版算法
🌕个人推广:每篇文章最下方都有加入方式,旨在交流学习&资源分享,快加入进来吧

TypeScript入门

内容参考链接
TypeScript(零) —— 简介、环境搭建、第一个实例搭建开发环境
TypeScript 基础(一)工作流、基本类型、高级类型工作流、基本类型、高级类型

文章目录

  • TypeScript入门
    • TypeScript 面向对象
      • object 对象类型
      • Interface 接口
      • class 类
      • Access Modifier 访问修饰符
      • module 模块
      • Generics 泛型
    • 本章小结


TypeScript 面向对象

object 对象类型

不同于 JavaScript 对象的 key-value 键值对,TypeScript 为 key-type 键类型对。一般不在 person 后面使用 : object,因为使用后 person 就相当于一个 {},这样的话我们获取 person.age 都会报错,因为根本获取不到。

const person = {firstName: "前端",lastName: "杂货铺",age: 22
}

在这里插入图片描述

Interface 接口

给参数对象做限制,可以使得业务和逻辑更加清晰。

在这里插入图片描述

class 类

简单的讲,class 类就是紧密相关的属性和函数的结合。

我们创建一个接口 IPoint,在里面对坐标点和方法进行一些限制。之后我们创建 Point 类,让它实现接口 IPoint,在里面定义成员变量、构造函数和成员方法。再之后,我们创建 point 实例,通过该实例调用方法。

interface IPoint {// 坐标点x: number;y: number;// 打印当前坐标点信息的函数,不需要接受参数,没有返回值drawPoint: () => void;// 获取距离的函数,传入对方的点信息的参数,输出的是数字getDistances: (p: IPoint) => number;
}// Point类 实现的接口是 IPoint
class Point implements IPoint {// 成员变量x: number;y: number;// 构造函数constructor(x: number, y: number) {this.x = x;this.y = y;}// 成员方法drawPoint = () => {console.log('x: ', this.x, ' y: ', this.y);};getDistances = (p: IPoint) => {return Math.pow(p.x - this.x, 2) + Math.pow(p.y - this.y, 2)};
}const point = new Point(2, 3)
point.drawPoint()

在这里插入图片描述

Access Modifier 访问修饰符

当我们希望避免外界直接操作 class 内部的属性,这个时候我们就需要访问修饰符对访问 class 内部的方法或者是变量加以限制。

访问修饰符:public(默认)、private、protected【公有、私有、受保护】

下面,我们使用 set 和 get 的两种方式对私有变量进行赋值和读取。

interface IPoint {// 打印当前坐标点信息的函数,不需要接受参数,没有返回值drawPoint: () => void;// 获取距离的函数,传入对方的点信息的参数,输出的是数字getDistances: (p: IPoint) => number;// X 采用“懒人包”的写法X: number;// getX: () => number;// Y 保持着 set 和 get 的写法getY: () => number;// setX: (value) => void;setY: (value) => void;
}// Point类 实现的接口是 IPoint
class Point implements IPoint {// 构造函数constructor(private x: number, private y: number) {}// 成员方法drawPoint = () => {console.log('x: ', this.x, ' y: ', this.y);};getDistances = (p: IPoint) => {return Math.pow(p.X - this.x, 2) + Math.pow(p.getY() - this.y, 2)};set X(value: number) {if (value < 0) {throw new Error('value不能小于0')}this.x = value};get X() {return this.x};setY = (value: number) => {if (value < 0) {throw new Error('value不能小于0')}this.y = value};getY = () => {return this.y};
}const point = new Point(24, 50)
point.X = 10
console.log(point.X)
point.setY(8)
console.log(point.getY())

在这里插入图片描述

module 模块

TS 的模块和 JS 的模块没有什么区别,就是把一个复杂的程序依据一定的规则(规范)封装成几个块(文件),并进行组合在一起;块的内部数据与实现是私有的,只是向外部暴露一些接口(方法)与外部其它模块通信。

我们对上面的程序进行模块化拆分,分成 point.ts 和 main.ts

point.ts 中,我们使用 export 关键字导出类

interface IPoint {// 打印当前坐标点信息的函数,不需要接受参数,没有返回值drawPoint: () => void;// 获取距离的函数,传入对方的点信息的参数,输出的是数字getDistances: (p: IPoint) => number;// X 采用“懒人包”的写法X: number;// getX: () => number;// Y 保持着 set 和 get 的写法getY: () => number;// setX: (value) => void;setY: (value) => void;
}// Point类 实现的接口是 IPoint
export class Point implements IPoint {// 构造函数constructor(private x: number, private y: number) {// this.x = x;// this.y = y;}// 成员方法drawPoint = () => {console.log('x: ', this.x, ' y: ', this.y);};getDistances = (p: IPoint) => {return Math.pow(p.X - this.x, 2) + Math.pow(p.getY() - this.y, 2)};set X(value: number) {if (value < 0) {throw new Error('value不能小于0')}this.x = value};get X() {return this.x};setY = (value: number) => {if (value < 0) {throw new Error('value不能小于0')}this.y = value};getY = () => {return this.y};
}

在 main.ts 中我们使用 import 关键字导入类

import { Point } from './point'const point = new Point(24, 50)
point.X = 10
console.log(point.X)
point.setY(8)
console.log(point.getY())

在这里插入图片描述

Generics 泛型

泛型程序设计(generic programming)是程序设计语言的一种风格或范式。泛型允许程序员在强类型程序设计语言中编写代码时使用一些以后才指定的类型,在实例化时作为参数指明这些类型。

类型+<> 这种表达方式就是泛型

let list: Array<number> = [1, 2, 3]
// 泛型的表达方式
let lastInArray = <T>(arr: T[]) => {return arr[arr.length - 1]
}const l1 = lastInArray([1, 2, 3, 4])
const l2 = lastInArray(['a', 'b', 'c'])
const l3 = lastInArray<string | number>(['a', 'b', 'c'])// 多泛型的表达方式
let makeTuple = <T, Y>(x: T, y: Y) => [x, y]const v1 = makeTuple(1, 'one')
const v2 = makeTuple<boolean, number>(true, 1)

本章小结

本篇文章介绍了 TypeScript 中面向对象的内容,注意 TS 的对象类型是 key-type 而非 key-value。

对于 Interface 接口,我们可以把它看成一种约定,我们类的实现要遵守它。

访问修饰符分为 public、private、protected 三种,当使用 private 私有修饰符时要想在外面修改或获取到某个属性,可以使用 set 和 get 方法。

Generics 泛型,我们有着约定俗成的写法,它允许我们编写代码时使用一些以后才指定的类型。

TS 入门暂告一段落,三篇文章不可能把 TS 的全部知识点都陈列,更多的 TS 知识请大家自行学习探讨…


参考资料:

  1. 模块化的作用 【作者:Leah】
  2. 泛型·百度百科
  3. TypeScript 入门讲解 【作者:阿莱克斯刘】

在这里插入图片描述


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

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

相关文章

【AI底层逻辑】——篇章3(上):数据、信息与知识香农信息论信息熵

目录 引入 一、数据、信息、知识 二、“用信息丈量世界” 1、香农信息三定律 2、一条信息的价值 3、信息的熵 总结 引入 AI是一种处理信息的模型&#xff0c;我们把信息当作一种内容的载体&#xff0c;计算机发明以前很少有人思考它的本质是什么。随着通信技术的发展&a…

新后端漏洞之----SSRF漏洞(服务端请求伪造)

笔记 前言SSRF漏洞概述SSRF漏洞检测与挖掘SSRF漏洞的回显分类SSRF漏洞利用SSRF漏洞防御 前言 这几天各种技术面试接踵而至&#xff0c;压得我喘不过气了&#xff01;然后面试官问了我这个SSRF漏洞原理和利用方式以及防御手段&#xff0c;当然同时还问了好几个Top10漏洞&#x…

记一次 .NET 某医院预约平台 非托管泄露分析

一&#xff1a;背景 1. 讲故事 前几天有位朋友找到我&#xff0c;说他的程序有内存泄露&#xff0c;让我帮忙排查一下&#xff0c;截图如下&#xff1a; 说实话看到 32bit&#xff0c; 1.5G 这些关键词之后&#xff0c;职业敏感告诉我&#xff0c;他这个可能是虚拟地址紧张所…

Selenium Wire编辑header破解反爬机制和访问限制

一、selenium Wire介绍 介绍 Selenium Wire扩展了Selenium的Python绑定&#xff0c;使您能够访问浏览器发出的底层请求。您已使用Selenium相同的方式编写代码&#xff0c;但是您获得了额外的api&#xff0c;用于检查请求和响应&#xff0c;并动态地对它们进行更改。&#xff08…

Unity基础 物理系统 刚体组件下的移动.碰撞.触发检测

当在Unity中创建游戏或应用程序时&#xff0c;重力系统是一个非常重要的组成部分。它可以模拟物体受到地球引力的影响&#xff0c;并产生逼真的物理效果。在Unity中&#xff0c;我们可以使用刚体组件和重力向量来控制重力系统。 首先&#xff0c;在Unity中创建一个物体&#xf…

基于Echarts2.X的地图数据可视化指南

目录 前言 一、关于Echarts版本 1、为什么用Echarts2.2.7 2、文件目录说明 二、地图数据可视化 1、新建map.html 2、Echarts图表初始化 3、参数设置 三、源码展示分析 1、初始化阶段 2、timelineOption.js模拟数据 总结 前言 在前面的博文&#xff08;数据会说话-从我国…

(学习日记)2023.04.29

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

1.7 完善自定位ShellCode后门

在之前的文章中&#xff0c;我们实现了一个正向的匿名管道ShellCode后门&#xff0c;为了保证文章的简洁易懂并没有增加针对调用函数的动态定位功能&#xff0c;此类方法在更换系统后则由于地址变化导致我们的后门无法正常使用&#xff0c;接下来将实现通过PEB获取GetProcAddre…

github上传超过100M的大文件

当上传的工程中有超过100M的文件时&#xff0c;直接上传github会产生如下报错&#xff1a; remote: error: File retinaface-R50/R50-0000.params is 112.54 MB; this exceeds GitHubs file size limit of 100.00 MB! [remote rejected] master -> master (pre-receive ho…

2023年07月数据库流行度最新排名

点击查看最新数据库流行度最新排名&#xff08;每月更新&#xff09; 2023年07月数据库流行度最新排名 TOP DB顶级数据库索引是通过分析在谷歌上搜索数据库名称的频率来创建的 一个数据库被搜索的次数越多&#xff0c;这个数据库就被认为越受欢迎。这是一个领先指标。原始数…

软件设计模式与体系结构-设计模式-结构型软件设计模式-桥接模式

四、桥接模式 桥接模式&#xff08;Bridge Pattern&#xff09;是一种软件设计模式&#xff0c;它用于将抽象部分与其具体实现部分解耦&#xff0c;使它们可以独立地变化。桥接模式的核心思想是将一个系统分为多个维度&#xff0c;并通过桥接连接这些维度&#xff0c;从而实现…

登录远程Linux桌面

远程桌面连接主要使用两种协议&#xff0c;一种是Windows上RDP协议&#xff0c;第二种是VNC协议&#xff0c;从使用效果来看&#xff0c;vnc更优秀。 一、VNC 使用x11vnc 1.安装x11vnc sudo apt install x11vnc 2.启动x11vnc x11vnc -passwd orangepi -display :0 -forever…