Sobes.tech
Middle

Кога трябва да използвате типове и кога интерфейси в TypeScript?

sobes.tech AI

Отговор от 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];
    
  • Създаване на алиаси за съществуващи типове:
    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
Обединяващи типове Да Не
Пресичащи типове Да Не
Примитивни типове/литерали Да Не
Кортежи Да Не
Алиаси на типове Да Не
Условни типове Да Не
Описание на обекти Да Да
Реализация чрез класове Не Да
Разширение Да (с използване на &) Да (с използване на extends)
Декларативно сливане Не Да

Общо взето, за описание на структурата на обекти е по-подходящо да се използва interface, тъй като е по-добре пригоден за обектно-ориентиран подход и поддържа декларативно сливане. За всичко останало, особено за комбинации и създаване на нови типове от съществуващи, type е по-гъвкав.