0Pricing
TypeScript Academy · Lezione

Unioni discriminate per un pattern matching sicuro

Aggiunga un campo letterale comune ai membri dell'unione per garantire la sicurezza dei tipi.

Unioni discriminate per un pattern matching sicuro è una lezione TypeScript Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento TypeScript Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso TypeScript Academy include 4 lezioni in totale.

Benvenuto

Le unioni discriminate aggiungono una proprietà letterale condivisa ai membri dell'unione. TypeScript utilizza questo discriminante per restringere il tipo nelle istruzioni switch e if.

La proprietà discriminante

Un discriminante è una proprietà con un tipo letterale univoco in ciascun membro dell'unione. TypeScript restringe l'unione in base al suo valore.
type Circle = { kind: 'circle'; radius: number };
type Square = { kind: 'square'; side: number };
type Shape = Circle | Square;

Restringimento con i controlli if

Controlli il discriminante in un'istruzione if. TypeScript restringe il tipo al membro corrispondente.
function area(shape: Shape): number {
  if (shape.kind === 'circle') {
    return Math.PI * shape.radius ** 2;
  }
  return shape.side ** 2; // narrowed to Square
}

Restringimento con switch/case

Le istruzioni switch funzionano perfettamente con le unioni discriminate. Ogni case restringe il tipo a un membro specifico.
function describe(shape: Shape): string {
  switch (shape.kind) {
    case 'circle': return `Circle r=${shape.radius}`;
    case 'square': return `Square s=${shape.side}`;
  }
}

Completezza con never

Aggiunga un case default che assegna il valore a `never`. Se aggiunge un nuovo membro all'unione e dimentica di gestirlo, TypeScript segnala un errore.
function area(shape: Shape): number {
  switch (shape.kind) {
    case 'circle': return Math.PI * shape.radius ** 2;
    case 'square': return shape.side ** 2;
    default:
      const _exhaustive: never = shape;
      throw new Error('Unhandled shape');
  }
}

Pattern del tipo Result

Le unioni discriminate sono perfette per il pattern Result: consentono di restituire dati di successo oppure un errore senza generare un'eccezione.
type Ok<T> = { ok: true; value: T };
type Err = { ok: false; error: string };
type Result<T> = Ok<T> | Err;

Pattern del tipo Action (stile Redux)

In Redux e in sistemi simili, le azioni sono unioni discriminate. Il campo `type` è il discriminante.
type Action =
  | { type: 'INCREMENT'; amount: number }
  | { type: 'DECREMENT'; amount: number }
  | { type: 'RESET' };

Più proprietà discriminanti

Un discriminante non deve necessariamente essere una singola proprietà: TypeScript può restringere il tipo in base a qualsiasi combinazione di controlli.
type AdminUser = { role: 'admin'; permissions: string[] };
type RegularUser = { role: 'user'; credits: number };
type User = AdminUser | RegularUser;

Anche le unioni non discriminate possono essere ristrette

Anche senza un discriminante, TypeScript restringe le unioni utilizzando typeof, instanceof e i controlli sulle proprietà.
type StringOrArr = string | string[];
function flatten(val: StringOrArr): string[] {
  return Array.isArray(val) ? val : [val];
}

Unioni discriminate e gerarchie di classi

Le unioni discriminate sono un'alternativa funzionale all'ereditarietà tra classi per modellare le varianti. Sono più semplici, serializzabili e funzionano bene con il pattern matching.

Nel mondo reale: unione delle risposte HTTP

Modelli i diversi stati di una risposta API come un'unione discriminata.
type ApiState<T> =
  | { status: 'loading' }
  | { status: 'success'; data: T }
  | { status: 'error'; message: string };

Verifica rapida

Che cosa deve avere ogni membro di un'unione discriminata affinché TypeScript possa restringere correttamente il tipo?

Riepilogo

Le unioni discriminate utilizzano una proprietà letterale condivisa come discriminante. Restringa il tipo con switch/case e aggiunga un controllo di completezza con never per individuare i casi non gestiti. Sono ideali per macchine a stati, azioni e risposte API.

Domande Frequenti

La lezione «Unioni discriminate per un pattern matching sicuro» è gratuita?

Sì — il testo completo di «Unioni discriminate per un pattern matching sicuro» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso TypeScript Academy, passa a CoddyKit PRO. Il corso TypeScript Academy include 4 lezioni in totale.

Cosa imparerò in «Unioni discriminate per un pattern matching sicuro»?

Aggiunga un campo letterale comune ai membri dell'unione per garantire la sicurezza dei tipi. Eserciti TypeScript Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare TypeScript Academy?

Non è richiesta alcuna esperienza precedente. TypeScript Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «Unioni discriminate per un pattern matching sicuro»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione TypeScript Academy?

Sì. Ogni lezione TypeScript Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Tipi unione: A o B
  2. Tipi intersezione: A e B
  3. Unioni discriminate per un pattern matching sicuro
  4. Pattern pratici con unioni e intersezioni
← Torna a TypeScript Academy