Uniuni Discriminate și Verificare Exhaustivă cu Tipul never în TypeScript

Ghid complet pentru Discriminated Unions (Tagged Unions) și Exhaustiveness Checking cu tipul never în TypeScript: modelarea stărilor de business fără stări invalide și siguranță la compilare.

Sintaxă
type Stare = { status: 'loading' } | { status: 'success'; data: User[] }; const _exhaustive: never = stare;

Uniunile Discriminate (cunoscute și ca Tagged Unions sau Algebraic Data Types) reprezintă cel mai important model de design arhitectural din TypeScript. În loc să modelăm o stare printr-un obiect cu zeci de proprietăți opționale (de exemplu { isLoading: boolean, data?: User[], error?: string }, care permite stări imposibile precum isLoading: true și error: "Eroare" simultan), uniunile discriminate fac stările invalide imposibil de reprezentat.

Modelarea corectă a unei cereri de rețea cu Discriminated Union
// Definim fiecare stare ca pe un tip de sine stătător cu o proprietate literală comună ('status'):
type StareCerere = 
    | { status: 'inactiv' }
    | { status: 'incarcare' }
    | { status: 'succes'; date: string[]; timestamp: number }
    | { status: 'eroare'; cod: number; mesaj: string };

function randeazaUi(stare: StareCerere): string {
    switch (stare.status) {
        case 'inactiv':
            return 'Apasă butonul pentru a începe.';
        case 'incarcare':
            return 'Se încarcă datele...';
        case 'succes':
            // TypeScript restrânge automat tipul: 'date' este garantat prezent!
            return `Date recepționate: ${stare.date.join(', ')}`;
        case 'eroare':
            // 'cod' și 'mesaj' sunt disponibile doar aici:
            return `Eroare ${stare.cod}: ${stare.mesaj}`;
    }
}

Verificarea Exhaustivă (Exhaustiveness Checking) cu tipul never

Ce se întâmplă dacă peste 6 luni un coleg adaugă o nouă stare în uniune (de exemplu | { status: 'anulat' }), dar uită să actualizeze funcția randeazaUi? Fără o verificare exhaustivă, codul va compila fără eroare, dar la runtime va returna silențios undefined!

Tehnica exhaustivă folosește faptul că tipul never reprezintă o stare imposibilă căreia nu i se poate atribui nicio valoare:

Garanție de compilare 100% cu ramura default: never
function proceseazaStareExhaustiv(stare: StareCerere) {
    switch (stare.status) {
        case 'inactiv':
            return "Inactiv";
        case 'incarcare':
            return "Încărcare";
        case 'succes':
            return "Succes";
        case 'eroare':
            return "Eroare";
        default:
            // Dacă toate cazurile au fost tratate, 'stare' are tipul 'never'.
            // Dacă un caz a fost omis, atribuirea de mai jos va declanșa o EROARE DE COMPILARE:
            const _verificareExhaustiva: never = stare;
            throw new Error(`Caz netratat: ${JSON.stringify(_verificareExhaustiva)}`);
    }
}

Beneficiile Majore ale Tipului never în Arhitectură

  1. Refactorizare fără frică: Dacă adăugați un nou membru într-o uniune de evenimente sau comenzi, compilatorul tsc vă va indica exact toate locurile din aplicație unde trebuie să implementați logica pentru noul caz.
  2. Zero State Bugs: Elimină complet combinările contradictorii de flag-uri booleene (cum ar fi isSuccess === true && isError === true).
Comunitate & Schimb de cunoștințe

Întrebări & Exemple de Cod: Uniuni Discriminate și Verificare Exhaustivă cu Tipul never

Ai o nelămurire despre utilizarea comenzii Uniuni Discriminate și Verificare Exhaustivă cu Tipul never sau ai descoperit un truc / fragment de cod util? Distribuie-l cu ceilalți programatori!

💬

Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!

Nu au fost adăugate încă întrebări sau exemple de cod pentru această pagină. Dacă ai întâlnit o problemă sau ai un snippet util, adaugă-l mai jos pentru a-i ajuta pe ceilalți.

Comunitate Adaugă o întrebare sau distribuie un cod

Moderare & Siguranță:

Pentru a menține calitatea și securitatea informațiilor, fiecare întrebare sau fragment de cod/prompt este analizat (manual sau prin moderare asistată de AI) înainte de publicare.