Пропустить до содержимого

Различия между типом и интерфейсом

Слияние объявлений (дополнение):

Интерфейсы поддерживают слияние объявлений: можно определить несколько интерфейсов с одинаковым именем, и 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