Назад к вопросам
Middle
131
questionbank

Когда следует использовать типы, а когда интерфейсы в TypeScript?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Типы (type) следует использовать для:

  • Объединений (unions) и пересечений (intersections):
    type Status = "pending" | "completed" | "failed";
    type UserWithAddress = User & Address;
    
  • Примитивных типов и литералов:
    type ID = string | number;
    type Direction = "up" | "down" | "left" | "right";
    
  • Кортежей (tuples):
    type RgbColor = [number, number, number];
    
  • Создания alias'ов для существующих типов:
    type StringOrNumber = string | number;
    
  • Условных типов (conditional types):
    type TypeOfProp<T, K extends keyof T> = T[K];
    

Интерфейсы (interface) следует использовать для:

  • Описание структуры объектов:
    interface User {
      id: number;
      name: string;
      age?: number; // Опциональное свойство
    }
    
  • Реализации классами (implements):
    interface Logger {
      log(message: string): void;
    }
    
    class ConsoleLogger implements Logger {
      log(message: string) {
        console.log(message);
      }
    }
    
  • Расширения других интерфейсов (extends):
    interface Person {
      name: string;
    }
    
    interface Employee extends Person {
      employeeId: number;
    }
    
  • Декларативного слияния (declaration merging): Это позволяет расширить существующий интерфейс, объявив его снова. С типами это невозможно.
    interface Box {
      width: number;
    }
    
    interface Box { // Это добавит свойство height к интерфейсу Box
      height: number;
    }
    

Краткое сравнение:

Особенность type interface
Союзные типы Да Нет
Пересекающиеся типы Да Нет
Примитивные типы/Литералы Да Нет
Кортежи Да Нет
Alias'ы типов Да Нет
Условные типы Да Нет
Описание объектов Да Да
Реализация классами Нет Да
Расширение Да (с использованием &) Да (с использованием extends)
Декларативное слияние Нет Да

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