Интерфейсы¶
Интерфейсы не оказывают никакого влияния на выполнение JS. Существует разные полезные возможности при объявления структуры переменных в TypeScript с помощью интерфейсов.
Следующие два являются эквивалентными объявлениями, первое использует встроенное описание, второе использует интерфейс:
1 2 3 4 5 6 7 8 9 |
|
Однако прелесть Примера B заключается в том, что если кто-то пишет основанную на myPoint
библиотеку, то ему легко расширить объявление myPoint
просто добавив новое свойство:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
Это потому, что интерфейсы в TypeScript не ограничены. Это жизненно важный принцип TypeScript, который позволяет имитировать расширяемость JavaScript с помощью интерфейсов.
Классы могут реализовывать интерфейсы¶
Если вы хотите использовать классы, следующие структуре объекта, который кто-то объявил для вас в интерфейсе
, вы можете сделать это, используя ключевое слово implements
для обеспечения совместимости:
1 2 3 4 5 6 7 8 9 |
|
По сути, при наличии этих implements
любое изменение во внешнем интерфейсе Point
приведет к ошибке компиляции в новом коде, что позволит вам следить за консистентностью кода:
1 2 3 4 5 6 7 8 9 10 11 |
|
Обратите внимание, что implements
ограничивает структуру экземпляров класса, т.е.
1 |
|
И такие вещи, как foo: Point = MyPoint
- это не одно и то же.
Советы¶
Не каждый интерфейс легко реализуем¶
Интерфейсы придуманы для объявления любой произвольной структуры, возможной в JavaScript.
Рассмотрим следующий интерфейс, где можно вызывать new
:
1 2 3 4 5 |
|
По сути, у вас будет что-то вроде:
1 2 3 4 5 6 7 |
|
Вы можете объявить различные структуры с помощью интерфейсов и безопасно использовать JS код с помощью проверок TypeScript. Однако не всегда возможно реализовать эти структуры как классы TypeScript.