Diskriminovaná (označená) unie je unie objektových typů, které všechny sdílejí společné literálové pole — diskriminátor — který kompilátor používá k rozlišení variant a bezpečnému zúžení.
=
| { : }
| { : ; : }
| { : ; : };
Diskriminovaná (označená) unie je unie objektových typů, které všechny sdílejí společné literálové pole — diskriminátor — který kompilátor používá k rozlišení variant a bezpečnému zúžení.
=
| { : }
| { : ; : }
| { : ; : };
Každý člen má literálové pole status. Jeho kontrola zúží přesně na jednu variantu, čímž odemkne pole této varianty:
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
}
}
Pokud se pokusíte přistupovat k r.data v případě loading, je to chyba při kompilaci — systém typů dělá neplatné kombinace nereprezentovatelné.
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;
}
}
Přiřazení never vás nutí zpracovat každý případ — přidejte nový status a kompilátor vám ukáže každý switch, který je třeba aktualizovat.
Diskriminované unie jsou idiomatickým způsobem, jak modelovat stav (loading/success/error), události/akce (Redux reducers) a jakákoli data "jedné z několika forem".
Dělají nelegální stavy nemožnými a spolu s trikem never vám poskytují vyčerpávající kontrolu v čase kompilace — obrovské zlepšení bezpečnosti oproti volnému modelování s boolean/volitelnými poli.