在早期的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;
}
}
版权归原作者 隐形喷火龙 所有, 如有侵权,请联系我们删除。