Skip to main content

Отличие types от interface

В TypeScript и type, и interface используются для определения типов данных, но они имеют некоторые различия в синтаксисе, возможностях и использовании.

1. Синтаксис

type: Используется ключевое слово type для создания псевдонимов типов.

type User = {
name: string;
age: number;
};

interface: Используется ключевое слово interface.

interface User {
name: string;
age: number;
}

2. Расширение

type: Для расширения типов используется оператор & (intersection).

type Person = {
name: string;
};

type User = Person & {
age: number;
};

interface: Для расширения интерфейсов используется ключевое слово extends.

interface Person {
name: string;
}

interface User extends Person {
age: number;
}

3. Объединение типов

type: Может создавать объединения (union) и пересечения (intersection) типов.

type ID = string | number; // Union type
type Combined = TypeA & TypeB; // Intersection type

interface: Не поддерживает объединения или пересечения напрямую. Однако можно расширять интерфейсы, чтобы достичь похожего результата.

interface A {
propA: string;
}

interface B {
propB: number;
}

interface Combined extends A, B {}

4. Примитивные типы и сложные конструкции

type: Может использоваться для определения примитивных типов, union-типов, кортежей и других сложных конструкций.

type StringOrNumber = string | number;
type Tuple = [string, number];

interface: Используется только для описания объектов. Не может использоваться для примитивов, union-типов или кортежей.

// Так нельзя:
interface StringOrNumber = string | number; // Ошибка

5. Декларативное слияние

type: Не поддерживает слияние. Если вы определите два типа с одинаковым именем, это вызовет ошибку.

type User = { name: string };
type User = { age: number }; // Ошибка: Дубликат идентификатора 'User'

interface: Поддерживает слияние. Если вы определите два интерфейса с одинаковым именем, они объединятся.

interface User {
name: string;
}

interface User {
age: number;
}

const user: User = {
name: "John",
age: 30,
};

6. Использование с классами

type: Не может быть реализован классом напрямую.

type Person = {
name: string;
};

class User implements Person { // Ошибка: Нельзя использовать type для реализации
name: string;
}

interface: Может быть реализован классом.

interface Person {
name: string;
}

class User implements Person {
name: string;
}

7. Производительность

type: Может быть менее производительным при работе с большими и сложными типами, так как TypeScript каждый раз вычисляет их.

interface: Обычно работает быстрее, так как интерфейсы кэшируются и оптимизируются компилятором.

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

  • Используйте type, если:

    • Нужно создать union-тип, intersection-тип или кортеж.
    • Работаете с примитивными типами.
    • Нужна гибкость в определении сложных типов.
  • Используйте interface, если:

    • Работаете с объектами и классами.
    • Нужно использовать декларативное слияние.
    • Хотите, чтобы код был более читаемым и понятным для других разработчиков (интерфейсы часто ассоциируются с ООП).

Итог

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

🚀 Источник: DeepSeek