Sobes.tech
Middle

Када треба користити типове, а када интерфејсе у TypeScript-у?

sobes.tech АИ

Одговор од АИ

Типови (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 је флексибилнији.