参考文档:Class
TS 增强了 JS 中类的概念,使其具有了完全的面向对象的特性。
// 声明一个类
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 类中甚至提供了和 Java 相似的成员变量访问修饰符用于编译检查:
访问级别既可以作用于属性,也可以作用于方法。
这也意味着,我们可以使用 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
上面我们讲到了类继承的特性,同时,与 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() {
}
}