TypeScript 扩展接口详解

在本教程中,你讲学习如何扩展接口,这样可以把一个接口的属性和方法复制到另外一个接口中。

扩展一个接口的接口

假设有一个名为 Mailable接口,它包含 send()queue() 两个方法:

interface Mailable {
  send(email: string): boolean;
  queue(email: string): boolean;
}

然后你有很多 已经实现了 Mailable 接口。现在,你想要在 Mailable 接口上添加一个新的方法, 表示它会延时发送邮件,如下所示:

later(email: string, after: number): void

Mailable 接口直接添加 later() 方法会破坏当前的代码,造成前后不兼容的问题。为了避免这个问题,你可以创建一个新的接口来扩展 Mailable 接口:

interface FutureMailable extends Mailable {
  later(email: string, after: number): boolean;
}

使用 extends 关键字按照下面的语法来扩展一个接口:

interface A {
  a(): void;
}

interface B extends A {
  b(): void;
}

接口 B 扩展了接口 A,它有两个方法 a()b()。与类相似,FutureMailable 接口从 Mailable 接口继承了 send()queue() 方法。

下面的例子演示如何实现 FutureMailable 接口:

class Mail implements FutureMailable {
  later(email: string, after: number): boolean {
    console.log(`Send email to ${email} in ${after} ms.`);
    return true;
  }
  send(email: string): boolean {
    console.log(`Sent email to ${email} after ${after} ms. `);
    return true;
  }
  queue(email: string): boolean {
    console.log(`Queue an email to ${email}.`);
    return true;
  }
}

扩展多个接口的接口

一个接口可以扩展多个接口,创建所有接口的组合,如下所示:

interface C {
  c(): void;
}

interface D extends B, C {
  d(): void;
}

在这个例子中,接口 D 扩展了 BC 接口,所以 D 接口有 BC 接口的所有方法: a(), b()c() 方法。

扩展类的接口

TypeScript 中允许接口扩展类,在这种情况下,接口会继承类的属性和方法,此外,接口可以继承类的私有成员和受保护成员,而不仅仅是公共成员。这意味着,当接口扩展具有私有成员和保护成员的类的时候,该接口只能有该接口所扩展的类或该类的子类中实现。

通过这种做法,可以把接口的使用范围限制为接口所继承的类或该类的子类,如果试图从一个不是接口继承的类或该类的子类来实现接口,则会抛出错误提示:

class Control {
  private state: boolean;
}

interface StatefulControl extends Control {
  enable(): void;
}

class Button extends Control implements StatefulControl {
  enable() {}
}
class TextBox extends Control implements StatefulControl {
  enable() {}
}
class Label extends Control {}

// Error: cannot implement
class Chart implements StatefulControl {
  enable() {}
}

小结

教程来源于Github,感谢cody1991大佬的无私奉献,致敬!

技术教程推荐

Go语言从入门到实战 -〔蔡超〕

说透中台 -〔王健〕

苏杰的产品创新课 -〔苏杰〕

移动端自动化测试实战 -〔思寒〕

编译原理实战课 -〔宫文学〕

分布式金融架构课 -〔任杰〕

玩转Vue 3全家桶 -〔大圣〕

李智慧 · 高并发架构实战课 -〔李智慧〕

快手 · 音视频技术入门课 -〔刘歧〕