En diskrimineret (mærket) union er en union af objekttyper, der alle deler et fælles literalt felt — diskriminatoren — som compileren bruger til at skelne varianterne og indsnævre sikkert.
=
| { : }
| { : ; : }
| { : ; : };
En diskrimineret (mærket) union er en union af objekttyper, der alle deler et fælles literalt felt — diskriminatoren — som compileren bruger til at skelne varianterne og indsnævre sikkert.
=
| { : }
| { : ; : }
| { : ; : };
Hvert medlem har et status-literalt felt. At kontrollere det indsnævrer til præcis én variant, hvilket låser op for den variants felter:
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 forsøger at få adgang til r.data i loading-tilfældet, er det en kompileringsfejl — typesystemet gør ugyldige kombinationer urepræsentable.
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-tildelingen tvinger dig til at håndtere alle tilfælde — tilføj en ny status, og compileren peger på hver switch, der skal opdateres.
Diskriminerede unions er den idiomatiske måde at modellere tilstand (loading/success/error), events/handlinger (Redux reducers) og enhver "en af flere former"-data på.
De gør ulovlige tilstande umulige og giver dig med never-tricket compile-tid udtømmende kontrol — en massiv sikkerhedsgevinst over løs boolean/valgfrit-felt-modellering.