Diskriminirano (označeno) združenje je združenje tipov objektov, ki vsi delijo skupno dobesedno polje — diskriminator — ki ga kompilator uporablja za razlikovanje variant in varno zoženje.
=
| { : }
| { : ; : }
| { : ; : };
Diskriminirano (označeno) združenje je združenje tipov objektov, ki vsi delijo skupno dobesedno polje — diskriminator — ki ga kompilator uporablja za razlikovanje variant in varno zoženje.
=
| { : }
| { : ; : }
| { : ; : };
Vsak član ima dobesedno polje status. Preverjanje ga zožuje na natanko eno varianto, kar odklenja polja te variante:
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
}
}
Če poskusiš dostopati do r.data v primeru loading, je to napaka pri prevajanju — sistem tipov naredi neveljavne kombinacije nepredstavljivimi.
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;
}
}
Dodelitev never te sili, da se spopadaš z vsakim primerom — dodaj novo stanje in kompilator te usmerita na vsak switch, ki ga je treba posodobiti.
Diskriminirana združenja so idiomatski način za modeliranje stanja (loading/success/error), dogodkov/akcij (reducerjev Redux) in vseh podatkov "ena od več oblik".
Omogočajo, da so neveljavna stanja nemogoča in skupaj s trikom never zagotavljajo preverjanje izčrpanosti med prevajanjem — ogromno zmago varnosti v primerjavi z ohlapnim modeliranjem z boolean/izbirnimi polji.