TypeScript(三):TypeScript面向对象

TypeScript面向对象

类的定义

  • 与JS不同的是,成员属性需要在前面进行提前声明
class Person{
    //需要在前面对成员变量进行声明
    name: string
    //声明的时候,可以对值进行初始化,初始化可以带有类型注解,也可以省略
    age = 18
    //constructor中的变量依旧要进行类型注解
    constructor(name:string,age:number) {
        this.name = name,
        this.age = age
    }
}

const p1 = new Person("zhangcheng", 20)

console.log(p1)

类的继承

  • 与JS中的继承是一样的
  • 使用 extends进行继承
  • 可以使用super

类的成员修饰符

在TypeScript中,类的属性和方法支持三种修饰符:public、private、protected

  • public:修饰的是在任何地方可见,公有的属性或方法,默认编写的属性就是public
  • private:修饰的仅在同一类中可见,私有的属性或者方法
  • protected:修饰的是仅在类自身以及子类中可见,受保护的属性或者方法
class Person{
    //可以自由访问,默认就是public
    public name: string
    //仅能在Person类中进行访问
    private age = 18
    //仅能在Person中,以及Person的子类中进行访问
    protected address:string = "河北省"
    constructor(name:string,age:number,address:string) {
        this.name = name,
        this.age = age,
        this.address = address
    }
}

只读属性readonly

  • 正常情况下,类创建的实例是可读可写的
  • 我们可以定义一个成员属性为只读属性
class Person{
    //这样name就只能读取,不能修改了
    readonly name: string
    constructor(name:string) {
        this.name = name,
    }
}

getters/setters

  • 主要是对私有属性,进行设置
  • 其目的是为了拦截,防止一些非法的操作发生
class Person{
    private _age: number
    constructor(_age: number) {
        this._age = _age
    }
    //对值进行设置
    set age(newValue: number) {
        //若设置的年龄过大或者过小则直接忽略
        if (newValue > 0 && newValue < 150) {
            this._age = newValue
        }
    }
    get age(): number{
        return this._age
    }
}

const p1 = new Person(18)
console.log(p1.age)
p1.age = 1000
console.log(p1.age)

参数属性

  • 前面我们知道在定义一个类中的成员属性,需要在前面进行声明
  • 而TS提供了一种语法糖,可以使代码看起来比较简洁
    • constructor中的变量前面,用写明修饰符public、private、protected、readonly即可
class Person{
    private _age: number
    constructor(_age: number) {
        this._age = _age
    }
}

//相当于以下写法
class Person{
    constructor(private _age: number) {
        this._age = _age
    }
}

抽象类abstract

  • 抽象类的特点
    • 抽象类不能通过new创建实例
    • 抽象类可以包含抽象方法,也可以包含实现的具体方法
    • 有抽象类的方法,必须是一个抽象类
    • 抽象方法必须在子类中实现
  • 现在有这样一个需求
    • 定义一个 shape抽象类,里面有一个getArea的抽象方法
    • 分别定义 三角形,圆形,长方形等多种形状的类
abstract class Shape {
    //抽象方法,必须存在于抽象类中,抽象类不必具体实现
    abstract getArea():number
}

//圆形
class Circle extends Shape{
    //继承自抽象类的子类,要具体实现其抽象方法
    getArea(): number {
        return 3.14*3*3
    }
}

//长方形
class Juxing extends Shape{
    getArea(): number {
        return 3*4
    }
}

function getShapeArea(shape: Shape) {
    //只需要调用Shape中的方法即可求出面积
    console.log(shape.getArea());
}

const c1 = new Circle()
const j1 = new Juxing()
console.log(getShapeArea(c1))
console.log(getShapeArea(j1))

image.png

类的特性

  • 可以通过new 创建实例对象
  • 可以当作类型注解
  • 可以当作有 构造签名的函数
class Person{ }

//通过Person创建一个实例对象
const p = new Person()

//当作一个类型注解
function printPerson(p: Person) { }

//当作一个有构造签名的函数
function factory(ctor: new () => void) { }
factory(Person)

对象类型的修饰符

  • 在创建对象类型的时候,其属性也可以进行修饰
  • 可选属性,在属性后面加?
  • 只读属性,在属性签名加readonly
type objType = {
    name?:string//可选属性
    readonly age:number//只读属性
}
interface Iobj{
     name?:string//可选属性
    readonly age:number//只读属性
}

对象类型的索引签名

  • 通常用于定义不明确对象中属性的类型
  • 只能通过 string或者number进行访问
//对象类型的索引签名
interface IObj{
    //可以通过字符串key进行访问,value可以是number类型或者boolean类型
    [key: string]: number | boolean
    //因为length属于用string访问,其返回值应当是上面中的子类
    length:boolean
}

//对象类型的索引签名
interface IArr{
    //可以通过字符串key进行访问,value可以是number类型或者boolean类型
    [key: number]: number | boolean
    //因为length属于用string访问,其返回值应当是上面中的子类
    length:boolean
}

接口继承

  • 使用 interface定义接口,是可以通过extends继承的
    • 可以减少代码量
    • 使用第三方库的时候,可以使用定义好的接口,同时可以定义自己的属性
interface Iobj{
     name?:string//可选属性
    readonly age:number//只读属性
}

interface Iobj2 extends Iobj{
    address:string
}

接口被类实现

  • 定义的接口,是可以被类实现的
  • 通过implements关键字进行接口的实现
  • 同时一个类可以实现多个接口
interface Person{
    name: string
    age: number
    address: string
    running:()=>void
}

//通过字面量直接实现
let p1:Person = {
    name: "zhangcheng",
    age: 18,
    address: "河北省",
    running() {
        console.log("running")
    }
}

interface IWalk {
    walk:()=>void
}
//通过类进行实现
//好处是可以直接通过new创建,省去了字面量创建的繁琐
//同时可以实现多个接口
class PersonClass implements Person,IWalk{
    constructor(public name:string,public age:number,public address:string) {
        this.name = name
        this.age = age
        this.address = address
    }
    running() {
        console.log("123");
        
    }
    walk() {
        console.log("456");
        
    }
}

const p2 = new PersonClass("zhangcheng", 18, "河北省")
console.log(p2.running());
console.log(p2.walk());

严格字面量赋值检测

  • 在TS中,有一个十分奇怪的现象
interface IPerson{
    name: string
    age:number
}

let p1:IPerson = {
    name: "zhangcheng",
    age: 18
    //若增加下面的属性则会报错
    //height:1.88
}

//但是进行如下操作不会报错
let p2 = {
    name: "zhangcheng",
    age: 18,
    height:1.88
}
let p3: IPerson = p2

function test(person: IPerson) { }

test({ name: "zhangcheng", age: 18 })
//依旧不会报错
test(p2)
  • 上面的代码中,我们使用interface创建了一个对象的类型
  • 同时用这个类型通过字面量方式以及赋值的方式,分别创建了几个对象
  • 发现通过 字面量创建的时候,会进行严格字面量的检测
  • 而通过赋值的方法,则不会进行检测
  • 这是因为,TS认为通过字面量创建的,就是新鲜的(这是TS成员在GitHub上面一个issue中提及的

枚举类型

  • 在TS中有一种类型叫枚举类型
  • 通常用于枚举一些常量
//在其内部实际上是从0开始计数的
//我们可以改变其默认值
enum EList {
    UP = 100,
    DOWN = "DOWN",
    LEFT,
    RIGHT,
}


function test(payload: EList) {
    switch (payload) {
        case EList.DOWN:
            console.log(123)
            break
   }
}

//传递的也是其内部的值
const p: EList = EList.DOWN
test(p)

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

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

相关文章

基于YOLOv7算法和Widerperson数据集的高精度实时行人检测系统(PyTorch+Pyside6+YOLOv7)

摘要&#xff1a;基于YOLOv7算法和Widerperson数据集的高精度实时行人检测系统可用于日常生活中检测与定位行人目标&#xff0c;此系统可完成对输入图片、视频、文件夹以及摄像头方式的目标检测与识别&#xff0c;同时本系统还支持检测结果可视化与导出。本系统采用YOLOv7目标检…

3个密码学相关的问题

一、离散对数问题&#xff08;Discrete Logarithm Problem, DLP&#xff09; 问题描述&#xff1a;给定 有限阿贝尓群 G中的2个元素a和b&#xff0c;找出最小的正整数x满足&#xff1a;b a ^^ x &#xff08;或者证明这样的x不存在&#xff09;。 二、阶数问题&#xff08;O…

云服务器ECS价格表出炉——阿里云

2024年阿里云服务器租用价格表更新&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年、ECS u1实例2核4G、5M固定带宽、80G ESSD Entry盘优惠价格199元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元、2核4G4M带宽轻量服务器一年165元12个月、2核4G服…

[element] el-upload实现 “读取本地表格内容并上传“

需求: 通过表格一键导入数据 表格模板: 导入按钮: <el-uploadref"upload"class"filter-item"style"margin-left: 10px"action"/"accept".csv, application/vnd.ms-excel, application/vnd.openxmlformats-officedocument.sp…

Open3D三维重建

原始点云&#xff1a; alpha_shape算法 import open3d as o3dpcd o3d.io.read_point_cloud("airplane_0001.pcd") mesh o3d.geometry.TriangleMesh.create_from_point_cloud_alpha_shape(pcd, alpha0.1) o3d.visualization.draw_geometries([mesh], mesh_show_b…

相机图像质量研究(39)常见问题总结:编解码对成像的影响--运动模糊

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

我把ChatGPT部署到我的手机上

正常的大模型部署都是在服务器上的 但是最近我看到一个手机上可以运行的大模型 分享给大家 MiniCPM MiniCPM是基于 MLC-LLM 开发&#xff0c;将 MiniCPM 和 MiniCPM-V 在 Android 手机端上运行。 使用起来很简单&#xff0c;下载好安装包后 按照教程安装好 下载2个模型 一个是M…

C++拷贝构造函数与赋值运算符重载

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、拷贝构造函数 1.概念 在现实生活中&#xff0c;可能存在一个与你一样的自己&#xff0c;我们称其为双胞胎。 那在创…

虹科方案丨低负载ECU老化检测解决方案:CANCAN FD总线“一拖n”

来源&#xff1a;虹科汽车智能互联 虹科方案丨低负载ECU老化检测解决方案&#xff1a;CANCAN FD总线“一拖n” 原文链接&#xff1a;https://mp.weixin.qq.com/s/4tmhyE5hxeLFCiaeoRhlSg 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; #汽车总线 #ECU #CAN卡 导读 …

配置Python环境及job运行的虚拟环境

1、配置Jenkins的Python环境&#xff1a;Manage Jnekins-Global Tool Configuration-Python 2、安装pyenv插件 此插件会给每个job都创建一个虚拟Python环境 安装后&#xff0c;在job config-build中选择 virtualenv builder build job的时候会自动在/opt/jenkins(node主机的…

详解平面点云面积计算

部分代码展示&#xff1a; &#xff08;1&#xff09;利用格网法计算面积&#xff1a; //&#xff08;2&#xff09;测试使用格网法计算平面点云面积 void main() {char *inputpath "D:\\testdata\\data.txt";vector<pcl::PointXYZ> points ReadPointXYZIn…

vue的十大面试题详情

1 v-show与v-if区别 v-if与v-show可以根据条件的结果,来决定是否显示指定内容&#xff1a; v-if: 条件不满足时, 元素不会存在. v-show: 条件不满足时, 元素不会显示(但仍然存在). <div id"app"><button click"show !show">点我</but…

【动态规划专栏】专题二:路径问题--------6.地下城游戏

本专栏内容为&#xff1a;算法学习专栏&#xff0c;分为优选算法专栏&#xff0c;贪心算法专栏&#xff0c;动态规划专栏以及递归&#xff0c;搜索与回溯算法专栏四部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握算法。 &#x1f493;博主csdn个人主页&#xff1a;小…

【PX4-AutoPilot教程-TIPS】Gazebo仿真环境昏暗的解决办法即Ubuntu系统安装NVIDIA显卡驱动方法

Gazebo仿真环境昏暗的解决办法即Ubuntu系统安装NVIDIA显卡驱动方法 分析原因手动安装方法&#xff08;推荐&#xff09;自动安装方法检查是否安装成功Gazebo仿真环境前后对比 分析原因 具体原因为&#xff1a;大多数情况是因为显卡性能不足&#xff0c;Gazebo自动关闭了灯光和…

线性规划求解点云最大内接圆

欢迎关注更多精彩 关注我&#xff0c;学习常用算法与数据结构&#xff0c;一题多解&#xff0c;降维打击。 本期话题&#xff1a;利用线性规划求解点云最大内接圆 参考资料&#xff1a; Tschebyscheff approximation for the calculation of maximum inscribed minimum circ…

风云温商在湖北:黄卓仁会长的商业传奇

黄卓仁,一位来自柳市的传奇人物,他的人生就像一部精彩纷呈的商业传奇,充满了挑战与机遇。他是1966年出生的优秀民营企业家,也是一位充满激情与智慧的领导者。今天,让我们一起走进黄卓仁的世界,感受他那不凡的人生历程。 首先,让我们了解一下黄卓仁的基本情况。他是温州人,出生…

[极客大挑战2019]upload

该题考点&#xff1a;后缀黑名单文件内容过滤php木马的几种书写方法 phtml可以解析php代码&#xff1b;<script language"php">eval($_POST[cmd]);</script> 犯蠢的点儿&#xff1a;利用html、php空格和php.不解析<script language"php"&…

492. Construct the Rectangle(构造矩形)

问题描述 作为一位web开发者&#xff0c; 懂得怎样去规划一个页面的尺寸是很重要的。 所以&#xff0c;现给定一个具体的矩形页面面积&#xff0c;你的任务是设计一个长度为 L 和宽度为 W 且满足以下要求的矩形的页面。要求&#xff1a; 你设计的矩形页面必须等于给定的目标面…

基于Springboot+Vue的超市管理系统源码

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 随着社会经济的发展和…

文明的差分例题

解法一&#xff1a; 暴力 #include<iostream> #include<vector> #define endl \n using namespace std; void addNum(vector<int>& a) {int l, r, x;cin >> l >> r >> x;for (int i l; i < r; i)a[i] x; } void minusNum(vecto…