Typescript 基础
2021-12-27 15:35:45

TS 类

参考文档:Class

TS 增强了 JS 中类的概念,使其具有了完全的面向对象的特性。

面向对象编程的三大特点

  • 封装(Encapsulation):将对数据的操作细节隐藏起来,只暴露对外的接口。外界调用无需知道实现细节,就能通过对外提供的接口来访问该对象,
  • 继承(Inheritance):子类继承父类,子类除了拥有父类的所有特性外,还有一些更具体的特性。
  • 多态(Polymorphism):由继承而产生了相关的不同的类,对同一个方法可以有不同的响应。

TS 类的声明和使用

// 声明一个类
class Animal {
  
	// 成员变量(语法和接口很像)
	name: string;

	// 构造器
    // this 关键字的使用十分自然
	constructor(name: string) {
		this.name = name;
	}
    
    // 成员方法(类方法?)
	run() {
        return `${this.name} is running`;
    }
    
}

// 创建类的实例
const snake = new Animal('lily');

// 继承
class Dog extends Animal {
	bark() {
        return `${this.name} is barking`;
    }
}

const xiaobao = new Dog('xiaobao');
console.log(xiaobao.run());
console.log(xiaobao.bark());

// 重写构造函数示例,
// 在子类的构造函数中,必须使用 super 调用父类的方法,否则报错。
class Cat extends Animal {
	constructor(name) {
        super(name);
        console.log(this.name);
    }
    
    // 重写普通方法
    run() {
        return 'Meow, ' + super.run();
    }
    
}
const maomao = new Cat('maomao');
console.log(maomao.run());

TS 成员变量访问级别

TS 类中甚至提供了和 Java 相似的成员变量访问修饰符用于编译检查:

  • public 修饰的属性或方法是公有的,可以在任何地方被访问到,默认所有的属性和方法都是 public 的
  • private 修饰的属性或方法是私有的,不能在声明它的类的外部访问
  • protected 修饰的属性或方法是受保护的,它和 private 类似,区别是它在子类中也是允许被访问的

访问级别既可以作用于属性,也可以作用于方法。

这也意味着,我们可以使用 getter / setter 模式来向外提供受保护的访问接口了。

class Student {
    
    public name: string;
    private gender: string;
    protected school: String;

    constructor(name='', gender='', school='') {
        this.name = name;
        this.gender = gender;
        this.school = school;
    }

    public getGender() {
        // 做点什么?
        return this.gender;
    }
    
}

let kevyn = new Student('kevyn', 'm', 'MPI');
console.log(kevyn.getGender()); // m

TS 类与接口

上面我们讲到了类继承的特性,同时,与 Java 一样,类也可以实现一个接口。

interface Radio {
  switchRadio(trigger: boolean): void;
}
class Car implements Radio {
  switchRadio(trigger) {
    return 123
  }
}
class Cellphone implements Radio {
  switchRadio() {
  }
}

interface Battery {
  checkBatteryStatus(): void;
}

// 要实现多个接口,我们只需要中间用 逗号 隔开即可。
class Cellphone implements Radio, Battery {
  switchRadio() {
  }
  checkBatteryStatus() {

  }
}