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