抽象类与接口
一,类
定义类
部分与ES6用法基本一致。通过class定义类名,并通过constructor定义构造函数,通过super关键字来调用父类的方法。
class Person {name: string; // 属性constructor(name: string) { // 构造函数this.name = name;}eat() {console.log('person eat');}
}
继承类
在定义子类的时候通过extends关键字继承。
class Man extends Person { // 继承父类eat() {super.eat(); // 调用父类的eat方法console.log('man eat');}
}
泛型类
类的定义、类的属性、方法定义同样可以使用泛型。
class People<T> { // 泛型约束类private item: <T>; // 泛型约束属性constructor(item: T) { // 泛型约束构造函数参数this.item = item;}get(): T { // 泛型约束方法返回值return this.item;}
}
访问修饰符
ts提供了三种访问修饰符来属性和方法的访问权限:
- public(默认)- 公共的,可以在任何地方访问
- private - 私有的,只能在当前类访问
- protected - 受保护的,可以在当前类和子类访问
readonly修饰符
只读修饰符,如果与访问修饰符同时存在,放在访问修饰符的后面
name: string;
private readonly age: number; // age属性只读
二,抽象类
理解:
抽象类是不能被实例化的一个类,他可以定义普通方法和抽象方法,主要用来作为其他类的基类。
他定义的抽象方法只能通过继承来实现。
使用:abstract修饰符
示例:
abstract class Person { // 定义抽象类public name: string;public constructor (name: string) {this.name = name;}abstract eat (): any; // 定义抽象方法
}// 定义子类
class Man extends Person {public age: numberconstructor (name: string, age: number) {super(name) // 调用父类的构造函数this.age= age;}eat () { // 定义子类实现的方法console.log('eat sth');}
}// 实例化子类
var man = new Man('张三', 18);
三,接口
理解:
子类继承父类后,可以访问父类的非私有属性和方法,然而如果子类还有其他方法和其他类的方法用法一致,那便只能重新编写一次代码,因为一个类只能继承一个父类。因此接口就用来解决这个问题,一个类可以同时实现多个接口。
特点:
- 接口可以继承接口
- 接口可以继承类
- 类可以实现多个接口
- 也可以使用泛型约束接口
使用:
使用interface关键字定义接口;类使用implements关键字实现接口
示例:
// 定义接口1
interface Util {type: string; // 接口属性// 接口方法add(): number;minus(): number;
}// 定义接口2
interface Food {eat(): void;
}// 定义类并实现接口
class Man implements Util, Food {constructor (type: string) {this.type = type;}add() {return 1 + 1;}minus() {return 2 - 1;}eat() {console.log('eat ing');}
}// 定义接口3继承接口1
interface StringUtil extends Util {toString(): string;
}