Очень много где эти 2 оператора взаимозаменяемы и результат будет равносильный.
Однако пару различий все же есть:
1.
interface поддерживает
declaration merging, а
type - нет. Это бывает полезно для библиотек, которые позволяют расширять свое api, например через плагины.
Так же, при проверке типов, typescript будет учитывать для
interface, что он может быть расширен за пределами текущего проекта что наложит ряд ограничений.
2.
type позволяет
вычислить тип.
interface имеет гораздо меньше возможностей в этом плане.
Вообще это дело вкуса, но для себя я выбрал следующий подход:
Использовать
interface для типов которые экспортируются из библиотеки/npm-пакета и подразумевают возможность внешнего расширения описываемой сущности.
Во всех остальных случаях использовать
type.