Чем отличаются интерфейсы и типы в TypeScript?
В TypeScript существует два способа описания структур данных — это интерфейсы (interface) и типы (type). Оба этих способа позволяют задавать формы объектов, но между ними есть несколько ключевых отличий, которые следует учитывать при работе. Давайте рассмотрим эти отличия подробнее.
1. Определение
- Интерфейс (interface) используется для определения контракта, который должен быть реализован классами или объектами. Обычно его применяют для описания структуры объектов, классов и функций.
- Тип (type) — более общий инструмент, который позволяет описывать не только структуры объектов, но и объединять различные типы, использовать условные типы и делать множество других расширенных операций.
2. Расширение
Интерфейсы:
Интерфейсы поддерживают наследование, что позволяет одному интерфейсу расширять другой. Пример:
interface Person {
name: string;
age: number;
}
interface Employee extends Person {
employeeId: number;
}
В этом примере Employee
расширяет интерфейс Person
, добавляя новое свойство employeeId
.
Типы:
Типы также могут объединяться, но делают это с помощью объединений и пересечений. Пример:
type Person = {
name: string;
age: number;
}
type Employee = Person & {
employeeId: number;
}
Здесь Employee
создается с помощью пересечения, что эквивалентно расширению интерфейса.
3. Объединение типов
Типы предоставляют возможность использовать объединения, что позволяет комбинировать несколько типов в один. Например:
type StringOrNumber = string | number;
let value: StringOrNumber;
value = "Hello"; // допустимо
value = 42; // допустимо
Интерфейсы не поддерживают объединения.
4. Создание объектов
Синтаксис для определения объектов с помощью интерфейсов и типов похож, но не одинаков. Пример:
interface User {
username: string;
}
const user: User = {
username: "john_doe"
};
Или с использованием типа:
type User = {
username: string;
};
const user: User = {
username: "john_doe"
};
5. Совместимость
Интерфейсы более строгие в плане совместимости и реализации. TypeScript позволяет использовать интерфейсы, если структура объекта соответствует интерфейсу, даже если объект не явно реализует интерфейс. Типы также допускают такую гармонию, но с некоторыми ограничениями.
Заключение
Выбор между интерфейсами и типами в TypeScript зависит от ваших нужд. Если вам нужно только описать структуру объекта, интерфейсы могут быть более подходящими. Если же вам необходимо создавать сложные типы с несколькими вариантами и объединениями, лучше выбрать типы.
Используйте интерфейсы, когда хотите создать контракт, и типы, когда хотите описывать сложные значения!