Когда вы используете интерфейс над псевдонимом типа в потоке?

Объявления 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, абстрактные интерфейсы. Если экземпляр класса, вероятно, будет жителем вашего типа, вам, вероятно, нужен интерфейс.

Надеюсь, это поможет!