Перейти к основному содержимому

[Medium] Interface vs Type Alias

1. Что такое interface и type?

Чем отличаются interface и type в TypeScript?

Оба определяют типы, и они пересекаются во многих случаях описания формы объекта.

interface

interface User {
id: number;
name: string;
email?: string;
}

type

type User = {
id: number;
name: string;
email?: string;
};

Для базового моделирования объектов оба подхода допустимы.

2. Ключевые различия (Key Differences)

Темаinterfacetype
Форма объектаОтличноОтлично
Псевдоним примитиваНе поддерживаетсяПоддерживается
Union типНапрямую не поддерживаетсяПоддерживается
Tuple типНапрямую не поддерживаетсяПоддерживается
Слияние объявленийПоддерживаетсяНе поддерживается
Mapped/conditional типыОграниченоПервоклассная поддержка

3. Слияние объявлений (Declaration Merging)

Объявления interface с одинаковым именем объединяются.

interface Config {
apiBase: string;
}

interface Config {
timeout: number;
}

const cfg: Config = {
apiBase: '/api',
timeout: 5000,
};

type не может быть повторно открыт с тем же именем.

4. Union, tuple и расширенная композиция

Это естественно для type.

type Status = 'idle' | 'loading' | 'success' | 'error';
type Point = [number, number];

type ApiSuccess<T> = { ok: true; data: T };
type ApiFail = { ok: false; message: string };
type ApiResult<T> = ApiSuccess<T> | ApiFail;

5. Расширение и комбинирование (Extending and Combining)

Interface extends

interface Animal {
name: string;
}

interface Dog extends Animal {
bark(): void;
}

Type intersection

type Animal = { name: string };
type Dog = Animal & { bark(): void };

Оба паттерна распространены. Выбирайте тот, который соответствует соглашениям вашей команды.

6. Типы функций (Function Types)

interface Formatter {
(value: string): string;
}

type Parser = (input: string) => number;

Оба хорошо работают для сигнатур функций.

7. Практическое руководство по выбору (Practical Decision Guide)

Используйте interface, когда:

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

Используйте type, когда:

  • Вам нужны union/tuple/примитивные псевдонимы
  • Вы полагаетесь на mapped или conditional типы
  • Вы хотите составлять расширенную логику типов

8. Рекомендация для большинства команд

  • Начинайте с interface для простых контрактов объектов
  • Используйте type для union, tuple и программирования на уровне типов
  • Поддерживайте единообразие в каждой кодовой базе для снижения когнитивной нагрузки

9. Краткие ответы для собеседования (Quick Interview Answers)

В1: Один строго лучше другого?

Нет. Они во многом пересекаются; различия проявляются в продвинутых сценариях.

В2: Почему авторы библиотек могут предпочитать interface?

Слияние объявлений может улучшить расширяемость для потребителей.

В3: Почему код приложения может предпочитать type?

Код приложения часто использует union и композицию в стиле утилит.