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

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

Компании: Иннотех, Инрэко, Точка, Kvando Technologies, Soft_Media_Group, ООО Премиум ИТ Солюшен, Kodix, Aston, The Tribe, ЛОЦИЯ, Swetec, DigitalSail, EdenAI, TYMY

Стек: TypeScript

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

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

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

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

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

Типы создаются через type и могут представлять любые типы: примитивы (type ID = string), union (type Status = 'active' | 'inactive'), intersection (type A = B & C), кортежи, mapped types. Типы не поддерживают declaration merging - повторное объявление с тем же именем вызовет ошибку.

Ключевое различие: интерфейсы - это "контракты", которые можно расширять, а типы - это "алиасы" для любых форм данных. Для объектов в публичных API предпочтительнее интерфейсы из-за расширяемости.

На практике

Для описания props компонентов React, моделей данных, ответов API обычно используют интерфейсы - они дают понятные ошибки в IDE и позволяют расширять типы. Типы применяют для union-типов (например, type ButtonVariant = 'primary' | 'secondary'), для комбинаций через intersection, для условных типов. Если нужно описать функцию с перегрузкой - используют интерфейс. Для кортежей или маппинга - type.

Пример кода

TYPESCRIPT
// Интерфейс для объекта
interface User {
id: number;
name: string;
}
// Расширение интерфейса
interface AdminUser extends User {
role: 'admin';
}
// Тип для union
type Status = 'active' | 'inactive';
// Тип для intersection
type DetailedUser = User & { createdAt: Date };
// Тип для кортежа
type Pair = [string, number];
// Declaration merging интерфейсов
interface User {
email?: string; // добавили поле без ошибки
}
// Повторное объявление type вызовет ошибку
// type Status = 'pending'; // Error: Duplicate identifier

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

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

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

Интервьюер оценивает понимание базовых концепций TypeScript: статическая типизация, различие между интерфейсом и типом, знание declaration merging, умение выбирать подходящий инструмент под задачу. Также проверяется способность объяснить trade-offs: интерфейсы расширяемы, но менее гибки; типы гибки, но не расширяемы.

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

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

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

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