Различия между типом и интерфейсом
Слияние объявлений (дополнение):
Интерфейсы поддерживают слияние объявлений: можно определить несколько интерфейсов с одинаковым именем, и TypeScript объединит их в один интерфейс с совокупностью их свойств и методов. Типы, напротив, не поддерживают слияние объявлений. Это может быть полезно, если требуется добавить функциональность или настроить существующие типы без изменения исходных определений, а также дополнить отсутствующие либо исправить неверные типы.
interface A { x: string;}interface A { y: string;}const j: A = { x: 'xx', y: 'yy',};Расширение других типов и интерфейсов:
И типы, и интерфейсы могут расширять другие типы и интерфейсы, но синтаксис различается. Для интерфейсов используется ключевое слово extends, позволяющее наследовать свойства и методы других интерфейсов. Однако интерфейс не может расширять сложный тип, например тип объединения.
interface A { x: string; y: number;}interface B extends A { z: string;}const car: B = { x: 'x', y: 123, z: 'z',};Для типов оператор & используется для объединения нескольких типов в один тип (пересечение).
interface A { x: string; y: number;}
type B = A & { j: string;};
const c: B = { x: 'x', y: 123, j: 'j',};Типы объединения и пересечения:
Типы предоставляют больше возможностей при определении типов объединения и пересечения. С помощью ключевого слова type можно легко создавать типы объединения, используя оператор |, и типы пересечения, используя оператор &. Хотя интерфейсы также могут косвенно представлять типы объединения, у них нет встроенной поддержки типов пересечения.
type Department = 'dep-x' | 'dep-y'; // Union
type Person = { name: string; age: number;};
type Employee = { id: number; department: Department;};
type EmployeeInfo = Person & Employee; // IntersectionПример с интерфейсами:
interface A { x: 'x';}interface B { y: 'y';}
type C = A | B; // Union of interfaces