Sobes.tech
Middle

Quando usare i tipi e quando le interfacce in TypeScript?

sobes.tech AI

Risposta dell'AI

I tipi (type) dovrebbero essere usati per:

  • Unioni (unions) e intersezioni (intersections):
    type Status = "pending" | "completed" | "failed";
    type UserWithAddress = User & Address;
    
  • Tipi primitivi e letterali:
    type ID = string | number;
    type Direction = "up" | "down" | "left" | "right";
    
  • Tuple:
    type RgbColor = [number, number, number];
    
  • Creazione di alias per tipi esistenti:
    type StringOrNumber = string | number;
    
  • Tipi condizionali:
    type TypeOfProp<T, K extends keyof T> = T[K];
    

Le interfacce (interface) dovrebbero essere usate per:

  • Descrivere la struttura degli oggetti:
    interface User {
      id: number;
      name: string;
      age?: number; // Proprietà opzionale
    }
    
  • Implementazione tramite classi (implements):
    interface Logger {
      log(message: string): void;
    }
    
    class ConsoleLogger implements Logger {
      log(message: string) {
        console.log(message);
      }
    }
    
  • Estensione di altre interfacce (extends):
    interface Person {
      name: string;
    }
    
    interface Employee extends Person {
      employeeId: number;
    }
    
  • Unione dichiarativa (declaration merging): Questo permette di estendere un'interfaccia esistente dichiarandola di nuovo. Con i tipi, ciò non è possibile.
    interface Box {
      width: number;
    }
    
    interface Box { // Questo aggiungerà la proprietà height all'interfaccia Box
      height: number;
    }
    

Breve confronto:

Caratteristica type interface
Tipi unione No
Tipi intersezione No
Tipi primitivi/literal No
Tuple No
Alias di tipi No
Tipi condizionali No
Descrizione oggetti
Implementazione con classi No
Estensione Sì (con &) Sì (con extends)
Fusione dichiarativa No

In generale, per descrivere la struttura degli oggetti, è preferibile usare interface, poiché si adatta meglio all'approccio orientato agli oggetti e supporta la fusione dichiarativa. Per tutto il resto, specialmente per combinazioni e creazione di nuovi tipi da tipi esistenti, type è più flessibile.