En diskriminert (merket) union er en union av objekttyper som alle deler et felles litteralt felt — diskriminanten — som kompilatoren bruker til å skille variantene og utføre sikker narrowing.
=
| { : }
| { : ; : }
| { : ; : };
En diskriminert (merket) union er en union av objekttyper som alle deler et felles litteralt felt — diskriminanten — som kompilatoren bruker til å skille variantene og utføre sikker narrowing.
=
| { : }
| { : ; : }
| { : ; : };
Hvert medlem har et status literal. Ved å sjekke det narrowes det til nøyaktig én variant, noe som låser opp feltene til den varianten:
function render(r: Result) {
switch (r.status) {
case "loading": return "...";
case "success": return r.data; // ✅ data exists only here
case "error": return r.message; // ✅ message exists only here
}
}
Hvis du prøver å få tilgang til r.data i loading-tilfellet, er det en kompileringsfeil — typesystemet gjør ugyldige kombinasjoner urepresentable.
function render2(r: Result): string {
switch (r.status) {
case "loading": return "...";
case "success": return r.data;
case "error": return r.message;
default:
const _exhaustive: never = r; // ✅ if you add a variant and forget a case, this errors
return _exhaustive;
}
}
never-tilordningen tvinger deg til å håndtere hvert tilfelle — legg til en ny status og kompilatoren peker deg på hver switch som må oppdateres.
Diskriminerte unioner er den idiomatiske måten å modellere tilstand (lasting/suksess/feil), hendelser/handlinger (Redux-reducere) og alle "en av flere former"-data.
De gjør ugyldige tilstander umulige og, med never-trikket, gir deg compile-time uttømmende kontroll — en enorm sikkerhetsvinn sammenlignet med løs boolean/valgfritt-felt-modellering.