接口除了约束结构之外,接口的另一个用途 —— 对类的一部分行为进行抽象。
类实现接口
interface Alarm {alert(): void;}class Door {open() {console.log("Door open");}close() {console.log("Door close");}}// 继承了 Door 类,实现了 Alarm 接口class SecurityDoor extends Door implements Alarm {alert() {console.log("SecurityDoor alert");}}
类实现多个接口
interface Alarm {alert(): void;}interface Light {lightOn(): void;lightOff(): void;}// Car 同时实现了 Alarm 和 Light 接口class Car implements Alarm, Light {alert() {console.log("Car alert");}lightOn() {console.log("Car light on");}lightOff() {console.log("Car light off");}}
接口继承接口
LightableAlarm 继承了 Alarm,除了拥有 alert 方法之外,还拥有两个新方法 lightOn 和 lightOff。
interface Alarm {alert(): void;}interface LightableAlarm extends Alarm {lightOn(): void;lightOff(): void;}class Car implements LightableAlarm {alert() {console.log("Car alert");}lightOn() {console.log("Car light on");}lightOff() {console.log("Car light off");}}
接口继承类
常见的面向对象语言中,接口是不能继承类的,但是在 TypeScript 中却是可以的:
class Point2d {x: number;y: number;constructor(x: number, y: number) {this.x = x;this.y = y;}}interface Point3d extends Point2d {z: number;}const point3d: Point3d = { x: 1, y: 2, z: 3 };
「接口继承类」和「接口继承接口」没有什么本质的区别。
实际上,当我们在声明 class Point 时,除了会创建一个名为 Point 的类之外,同时也创建了一个名为 Point 的类型(实例的类型)。
// 声明 class Point2d 时,会创建一个名为 Point2d 的类class Point2d {x: number;y: number;constructor(x: number, y: number) {this.x = x;this.y = y;}}// 同时也创建了一个名为 Point2d 的类型(实例的类型)interface Point2dInstanceType {x: number;y: number;}// 等价于 interface Point3d extends Point2dInstanceTypeinterface Point3d extends Point2d {z: number;}const point3d: Point3d = { x: 1, y: 2, z: 3 };
