Sobes.tech
Middle

Kiedy używać typów, a kiedy interfejsów w TypeScript?

sobes.tech AI

Odpowiedź od AI

Typy (type) powinny być używane do:

  • Unioni (unions) i przecięcia (intersections):
    type Status = "pending" | "completed" | "failed";
    type UserWithAddress = User & Address;
    
  • Typy prymitywne i literały:
    type ID = string | number;
    type Direction = "up" | "down" | "left" | "right";
    
  • Krotki (tuples):
    type RgbColor = [number, number, number];
    
  • Tworzenie aliasów dla istniejących typów:
    type StringOrNumber = string | number;
    
  • Typy warunkowe:
    type TypeOfProp<T, K extends keyof T> = T[K];
    

Interfejsy (interface) powinny być używane do:

  • Opisu struktury obiektów:
    interface User {
      id: number;
      name: string;
      age?: number; // opcjonalna właściwość
    }
    
  • Implementacji przez klasy (implements):
    interface Logger {
      log(message: string): void;
    }
    
    class ConsoleLogger implements Logger {
      log(message: string) {
        console.log(message);
      }
    }
    
  • Rozszerzania innych interfejsów (extends):
    interface Person {
      name: string;
    }
    
    interface Employee extends Person {
      employeeId: number;
    }
    
  • Deklaratywne łączenie (declaration merging): Pozwala na rozszerzenie istniejącego interfejsu, deklarując go ponownie. Z typami jest to niemożliwe.
    interface Box {
      width: number;
    }
    
    interface Box { // To doda właściwość height do interfejsu Box
      height: number;
    }
    

Krótko porównanie:

Cecha type interface
Typy unii Tak Nie
Typy przecięcia Tak Nie
Typy prymitywne/literały Tak Nie
Krotki Tak Nie
Alias typów Tak Nie
Typy warunkowe Tak Nie
Opis obiektów Tak Tak
Implementacja przez klasy Nie Tak
Rozszerzanie Tak (z użyciem &) Tak (z użyciem extends)
Deklaratywne łączenie Nie Tak

Ogólnie rzecz biorąc, do opisu struktury obiektów lepiej używać interface, ponieważ lepiej pasuje do podejścia obiektowego i obsługuje deklaratywne łączenie. Do wszystkiego innego, szczególnie do łączenia i tworzenia nowych typów z istniejących, type jest bardziej elastyczny.