Typescript. Когда использовать interface, а когда type?

Обновлено:

Сегодня мой ученик задал вот такой хороший вопрос:

Вопрос

Всем привет! Возник вопрос по использованию Интерфейсов (interface), когда все-таки лучше их применять вместо Типов (type)?

Владилен в ролике по Интерфейсам (Модуль 3 - Блок 2 Работа с типами - 3 Интерфейсы) говорит о преимуществе использования Интерфейсов перед Типами, в пример приводится наследование от интерфейсов User и Address. Но то же самое можно сделать без копирования полей, а с использованием Intersection Type : Interfaces.

Речь идёт об уроке в курсе мидла в result.school

interface IPerson {
  name: string;
  age: number;
  hobbies: string[];
};

interface IAddress {
  city: string;
  street: string;
};

interface IFullUser extends IPerson, IAddress {
  date: Date;
};

vs Types

type TPerson = {
  name: string;
  age: number;
  hobbies: string[];
};

type TAddress = {
  city: string;
  street: string;
};

type TFullUser = TPerson & TAddress & {
  date: Date;
};

Поправьте, пожалуйста, если что-то не так понял. И еще не смотрел ролики дальше, мб там есть и другие примеры сравнений

И есть ли, вообще какая-то принципиальная разница?

В документации такое пишут.

Ответ

Пожалуй ответ нужно начать с главного:

В сообществе TS разработчиков принято все объекты описывать используя interface, а type используют для семантического описания примитивов и различных комбинаций типов и интерфейсов.

Пример:

interface Pet {
  name: string,
}

interface Cat extends Pet {
  hasHair: boolean;
}

interface Dog extends Pet {
  frendly: boolean;
}

type HomePet = Dog | Cat;

function addHomePet(pet: HomePet) {
  cosole.log('pet:', pet);
}