Когда вы используете интерфейс над псевдонимом типа в потоке?
Объявления interface и type, похоже, делают то же самое. Когда вы используете один над другим?
type Fooable = {
foo(): string
}
против
interface Fooable {
foo(): string
}
Ответ 1
Это отличный вопрос. В идеале нет никакой разницы между интерфейсом и типом объекта. Как реализовано, существует несколько (часто тонких) различий между ними.
Самое большое различие заключается в том, что Flow считает методы, объявленные на интерфейсе, "доступными только для чтения". Это позволяет подтипам быть ковариантными w.r.t. методы, которые являются очень распространенным шаблоном с иерархиями наследования.
В свое время я хотел бы, чтобы Flow объединил эти понятия, но до сих пор здесь мое эмпирическое правило для выбора между интерфейсами и типами объектов:
Используйте типы объектов, чтобы описать пакеты в основном данных, которые передаются в вашем приложении, например, реквизит/состояние для компонентов React, действия Flux/Redux, похожие на JSON вещи.
Используйте интерфейсы для описания сервисных интерфейсов. Обычно это в основном методы, например, Rx.Observable/Observer, магазины Flux/Redux, абстрактные интерфейсы. Если экземпляр класса, вероятно, будет жителем вашего типа, вам, вероятно, нужен интерфейс.