Продвинутый Typescript
Теория: Использование интерфейсов
В этом уроке мы разберем использование интерфейсов. Их работа похожа на работу типов в TypeScript, однако есть и свои особенности.
Расширение интерфейса дополнительными полями
Если интерфейс необходимо расширить дополнительными полями после его инициализации, мы можем повторно объявить интерфейс с новыми свойствами. Такой способ называется «слиянием деклараций»:
Здесь мы создали интерфейс IUser, а затем для демонстрационных целей расширили его новыми свойствами. После этого создали на его основе объект Sergey.
Расширение интерфейса с помощью другого интерфейса
Также мы можем расширить интерфейс с помощью создания другого интерфейса, который наследуется от него:
В этом примере мы создали на основе нашего предыдущего интерфейса IUser еще один — IStudent, в который добавили свойство group. Так интерфейс IStudent имеет все свойства IUser и все свойства, которые мы указали при его расширении от IUser, то есть дополнительно group.
Расширение нескольких интерфейсов
Еще интерфейсы могут расширять сразу несколько других интерфейсов:
В примере выше мы создали экземпляр на основе интерфейса IAuthor, который был создан путем расширения интерфейсов IUser и IEditor. Этот экземпляр взял в себя все свойства данных интерфейсов и свойство, которое мы указали при создании самого интерфейса IAuthor.
Создание intersection types
Также TypeScript позволяет нам создавать перекрестные типы (intersection types) из нескольких интерфейсов с помощью литерала &:
Здесь мы создали тип OneWayOrAnother на основе двух интерфейсов при помощи литерала &. Данный тип включил в себя все свойства указанных интерфейсов.
Между созданием перекрестных типов и расширением интерфейсов нет существенных отличий. Почти всегда эти действия будут взаимозаменяемыми, поэтому это скорее вопрос удобства. Но существуют исключения: иногда расширение интерфейса ведет себя не так, как создание перекрестного типа.
Иногда мы не знаем заранее всех свойств, которые будут содержаться в нашем интерфейсе, но нам известно их возможное содержание. В таком случае удобно использовать специальную индексную сигнатуру, которая позволяет описать типы возможных значений:
В примере выше мы создали телефонную книгу с помощью индексной сигнатуры. Это позволило нам не указывать множество свойств с именами, а всего лишь один раз указать тип ключа и тип его значения.
Так интерфейсы — это еще один мощный инструмент в TypeScript наряду с типами. Он позволяет гибко описать наши данные. Интерфейс удобно поддается расширению и объединению с другими типами или интерфейсами.





