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 | Sì | No |
| Tipi intersezione | Sì | No |
| Tipi primitivi/literal | Sì | No |
| Tuple | Sì | No |
| Alias di tipi | Sì | No |
| Tipi condizionali | Sì | No |
| Descrizione oggetti | Sì | Sì |
| Implementazione con classi | No | Sì |
| Estensione | Sì (con &) |
Sì (con extends) |
| Fusione dichiarativa | No | Sì |
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.