---
sidebar_position: 3
---

# Отличие types от interface

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

### 1. Синтаксис
**`type:`**
Используется ключевое слово type для создания псевдонимов типов.
```ts
type User = {
  name: string;
  age: number;
};
```
**`interface:`**
Используется ключевое слово interface.
```ts
interface User {
  name: string;
  age: number;
}
```

### 2. Расширение
**`type:`**
Для расширения типов используется оператор & (intersection).
```ts
type Person = {
  name: string;
};

type User = Person & {
  age: number;
};
```
**`interface:`**
Для расширения интерфейсов используется ключевое слово extends.
```ts
interface Person {
  name: string;
}

interface User extends Person {
  age: number;
}
```

### 3. Объединение типов
**`type:`**
Может создавать объединения (union) и пересечения (intersection) типов.
```ts
type ID = string | number; // Union type
type Combined = TypeA & TypeB; // Intersection type
```
**`interface:`**
Не поддерживает объединения или пересечения напрямую. Однако можно расширять интерфейсы, чтобы достичь похожего результата.
```ts
interface A {
  propA: string;
}

interface B {
  propB: number;
}

interface Combined extends A, B {}
```

### 4. Примитивные типы и сложные конструкции
**`type:`**
Может использоваться для определения примитивных типов, union-типов, кортежей и других сложных конструкций.
```ts
type StringOrNumber = string | number;
type Tuple = [string, number];
```
**`interface:`**
Используется только для описания объектов. Не может использоваться для примитивов, union-типов или кортежей.
```ts
// Так нельзя:
interface StringOrNumber = string | number; // Ошибка
```

### 5. Декларативное слияние
**`type:`**
Не поддерживает слияние. Если вы определите два типа с одинаковым именем, это вызовет ошибку.
```ts
type User = { name: string };
type User = { age: number }; // Ошибка: Дубликат идентификатора 'User'
```
**`interface:`**
Поддерживает слияние. Если вы определите два интерфейса с одинаковым именем, они объединятся.
```ts
interface User {
  name: string;
}

interface User {
  age: number;
}

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

### 6. Использование с классами
**`type:`**
Не может быть реализован классом напрямую.
```ts
type Person = {
  name: string;
};

class User implements Person { // Ошибка: Нельзя использовать type для реализации
  name: string;
}
```
**`interface:`**
Может быть реализован классом.
```ts
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_**