> Что такое интерфейсы и типы в TypeScript, для чего они нужны и чем отличаются? (JavaScript)

Уровень: junior · Роль: frontend · Язык: JavaScript · Категория: Технические вопросы

Компании: TrendTech

Стек: Node.js, JavaScript, TypeScript

> Пример ответа

Короткий ответ

Интерфейсы и типы в TypeScript - это инструменты для описания формы данных. Они нужны для статической типизации: компилятор проверяет, что объекты, функции и переменные соответствуют заданной структуре. Основное отличие: интерфейсы (interface) могут быть расширены (extends) и объединены (declaration merging), а типы (type) - нет, но типы поддерживают union, intersection и более сложные конструкции.

Подробное объяснение

Интерфейсы и типы решают одну задачу - описывают контракт данных, но имеют разные возможности. Интерфейсы создаются через ключевое слово interface и поддерживают:

  • наследование через extends
  • объединение объявлений (declaration merging) - если два интерфейса с одним именем, они автоматически сливаются
  • описание классов через implements

Типы создаются через type и поддерживают:

  • union (|) и intersection (&)
  • условные типы, mapped types, utility types
  • примитивные типы, кортежи, литеральные типы

Интерфейсы более гибки для объектных структур, типы - для сложных композиций. На практике для описания объектов и классов чаще используют интерфейсы, для union-типов, кортежей и сложных преобразований - типы.

На практике

В реальных проектах выбор между интерфейсом и типом зависит от задачи:

  • Если нужно описать форму объекта, который может быть расширен в будущем (например, пропсы компонента), используй интерфейс - его проще расширить через extends
  • Если нужен union-тип (например, string | number), intersection или условный тип - только type
  • Для описания классов интерфейс удобнее, так как поддерживает implements
  • Если в коде встречается declaration merging (например, добавление свойств в глобальный объект Window), нужен интерфейс

Пример кода

TYPESCRIPT
// Интерфейс для объекта
interface User {
name: string;
age: number;
}
// Расширение интерфейса
interface Admin extends User {
role: 'admin';
}
// Declaration merging
interface User {
email?: string;
}
// Теперь User имеет name, age и email
// Тип для union
type Status = 'active' | 'inactive' | 'pending';
// Тип для intersection
type PersonWithId = User & { id: string };
// Тип для кортежа
type Point = [number, number];
// Тип с условным выражением
type IsString<T> = T extends string ? 'yes' : 'no';

Как отвечать на собеседовании

Начни с общего назначения: оба инструмента описывают структуру данных для статической проверки. Затем перечисли ключевые отличия: интерфейсы поддерживают extends и declaration merging, типы - union, intersection и сложные конструкции. Приведи примеры, когда что использовать: интерфейс для объекта, тип для union. Не углубляйся в редкие кейсы, если не спросят. Будь готов показать код.

Что проверяет интервьюер

Интервьюер оценивает:

  • понимание базовой разницы между интерфейсом и типом
  • знание практических сценариев использования
  • способность объяснить, когда что выбрать
  • отсутствие путаницы: интерфейсы и типы не взаимозаменяемы во всех случаях

Типичные ошибки

  • Говорить, что интерфейсы и типы - это одно и то же
  • Утверждать, что типы нельзя расширять (можно через intersection &)
  • Путать declaration merging интерфейсов с переопределением типов (типы нельзя переобъявлять)
  • Использовать интерфейс для union-типа (это синтаксическая ошибка)
  • Не упоминать, что для классов интерфейс предпочтительнее из-за implements

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью