极简TypeScript教程--面向对象

文章介绍了TypeScript中类的定义和使用,包括属性、构造函数、方法。接着讨论了类的继承,如何通过extends关键字实现,并展示了Student类继承Person类的例子。此外,还提到了类的成员修饰符(public,private,protected)的作用。文章还涵盖了抽象类和抽象方法的概念,以及接口的继承和实现,最后讲解了枚举类型的使用。
摘要由CSDN通过智能技术生成

在早期的JavaScript开发中(ES5)我们需要通过函数和原型链来实现类和继承,从ES6开始,引入了class关键字,可以更加方便的定义和使用类。TypeScript作为JavaScript的超集,也是支持使用class关键字的,并且还可以对类的属性和方法等进行静态类型检测。

类的定义

我们来定义一个Person类:

class Person {
    // 定义类的属性
    name: string
    age: number
    // 构造函数
    constructor(name: string, age: number) {
        this.name = name
        this.age = age
    }
    // 定义类的方法
    running() {
        console.log(`${this.name} is running`);
    }
}
// 实例化
let cloud: Person = new Person('cloud', 18)
cloud.running()

我们可以声明类的属性:在类的内部声明类的属性以及对应的类型,如果类型没有声明,那么它们默认是any的;我们也可以给属性设置初始化值;在默认的strictPropertyInitialization模式下面我们的属性是必须初始化的,如果没有初始化,那么编译时就会报错;类可以有自己的构造函数constructor,当我们通过new关键字创建一个实例时,构造函数会被调用;构造函数不需要返回任何值,默认返回当前创建出来的实例;类中可以有自己的函数,定义的函数称之为方法;

类的继承

面向对象的其中一大特性就是继承,继承不仅仅可以减少我们的代码量,也是多态的使用前提。我们使用extends关键字来实现继承,子类中使用super来访问父类。我们来看一下Student类继承自Person:

class Student extends Person {
    sno: number

    constructor(name: string, age: number, sno: number) {
        super(name, age);
        this.sno = sno
    }

    studying() {
        console.log(`${this.name} is studying`);
    }
}

let tifa: Student = new Student('tifa', 18, 123)
tifa.studying()

类的成员修饰符

在TypeScript中,类的属性和方法支持三种修饰符: public、private、protected,public 修饰的是在任何地方可见、公有的属性或方法,默认编写的属性就是public的;private 修饰的是仅在同一类中可见、私有的属性或方法;protected 修饰的是仅在类自身及子类中可见、受保护的属性或方法;

抽象类abstract

我们知道,继承是多态使用的前提。所以在定义很多通用的调用接口时, 我们通常会让调用者传入父类,通过多态来实现更加灵活的调用方式。但是,父类本身可能并不需要对某些方法进行具体的实现,所以父类中定义的方法,我们可以定义为抽象方法。

什么是 抽象方法? 在TypeScript中没有具体实现的方法(没有方法体),就是抽象方法。抽象方法,必须存在于抽象类中;抽象类是使用abstract声明的类;

抽象类有如下的特点:抽象类是不能被实例化(也就是不能通过new创建),抽象方法必须被子类实现,否则该类必须是一个抽象类;

// 定义抽象类和抽象方法
abstract class Shape {
    abstract getArea(): number
}

// 子类需要实现抽象方法
class Circle extends Shape {
    private r: number

    constructor(r: number) {
        super();
        this.r = r
    }

    getArea(): number {
        return this.r * this.r * Math.PI;
    }
}

接口继承与实现

接口和类一样是可以进行继承的,也是使用extends关键字:并且我们会发现,接口是支持多继承的(类不支持多继承)

接口定义后,也是可以被类实现的(使用implements):如果被一个类实现,那么在之后需要传入接口的地方,都可以将这个类传入;这就是面向接口开发;

interface Animal {
    running: () => void
}

// 接口可以继承其他接口,多个用逗号分隔
interface Person extends Animal {
    eating: () => void
}

// 类可实现多个接口,多个用逗号分隔
class Student implements Person {
    eating(): void {
        console.log('student is eating')
    }

    running(): void {
        console.log('student is running')
    }
}

枚举类型

枚举类型是为数不多的TypeScript特性有的特性之一:枚举其实就是将一组可能出现的值,一个个列举出来,定义在一个类型中,这个类型就是枚举类型;

enum Direction {
    LEFT,
    RIGHT,
    TOP,
    BOTTOM
}

function turnDirection(direction: Direction) {
    switch (direction) {
        case Direction.LEFT:
            console.log('向左转')
            break;
        case Direction.RIGHT:
            console.log('向右转')
            break;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值