Поиск по сайту
Ctrl + K
Вопросы по TS

Чем отличаются интерфейсы и типы в 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 зависит от ваших нужд. Если вам нужно только описать структуру объекта, интерфейсы могут быть более подходящими. Если же вам необходимо создавать сложные типы с несколькими вариантами и объединениями, лучше выбрать типы.

Используйте интерфейсы, когда хотите создать контракт, и типы, когда хотите описывать сложные значения!