0


极简TypeScript教程--面向对象

在早期的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;
    }
}

本文转载自: https://blog.csdn.net/ting4937/article/details/129141272
版权归原作者 隐形喷火龙 所有, 如有侵权,请联系我们删除。

“极简TypeScript教程--面向对象”的评论:

还没有评论