interface поддерживает extends (который компилируется быстрее чем intersection (
&
) как верно подметил
Василий Банников )
interface A extends B, C {}
interface B {}
type C = {}; // interface вполне может extends из type
interface поддерживает declaration merging
interface A {
a: number;
}
interface A {
b: number;
}
const a: A = {a: 1, b: 2};
type поддерживает вычисления типа на верхнем уровне
type A = B | C; // на interface такого не выразишь
В остальном различий нет.
Declaration merging может подложить жабу в реальном проекте, но полезен при написании библиотек, которые могут быть расширены извне (плагины jQuery например)
В целом type более универсален и надежен. И не сильно он медленнее. Вся его медленность заключается в том, что компилятор производит вычисления типа, которые так же возможны и в полях интерфейса, а значит присутствуют и там.
Для Java/C# разрабов, читающих TS, interface более понятная конструкция (хотя и обманчиво).
В целом все зависит от стайл гайда, который примет команда. Главное чтоб везде одинаково было.