В этом руководстве вы узнаете, как расширить интерфейс в TypeScript, который позволяет копировать свойства и методы одного интерфейса в другой.
Предположим, что у вас есть интерфейс с именем Mailable
, который содержит два метода send()
и queue()
:
interface Mailable { send(email: string): boolean queue(email: string): boolean }
И у вас есть много классов, которые уже реализовали интерфейс Mailable
.
Теперь вы хотите добавить в интерфейс Mailable
новый метод, который позже отправляет электронное письмо следующим образом:
later(email: string, after: number): void
Однако добавление метода later()
в интерфейс Mailable
нарушит текущий код.
Чтобы избежать этого, вы можете создать новый интерфейс, расширяющий интерфейс 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
наследует send()
и queue()
из интерфейса Mailable
.
Ниже показано, как реализовать интерфейс FutureMailable
:
Интерфейсы, расширяющие несколько интерфейсов
Интерфейс может расширять несколько интерфейсов, создавая комбинацию всех интерфейсов. Например:
interface C { c(): void } interface D extends B, C { d(): void }
В этом примере интерфейс D
расширяет интерфейсы B
и C
. Таким образом, D
имеет все методы интерфейсов Qg B
и C
, то есть 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() { } }
Заключение
- Интерфейс в TypeScript может расширять один или несколько существующих интерфейсов.
- Интерфейс также может расширять класс. Если класс содержит частные или защищенные члены, интерфейс может быть реализован только классом или подклассами этого класса.