A discriminated (tagged) union huwa unjoni ta' tipi ta' oġġetti li kollha jaqsmu komuni literal field — il-discriminant — li l-compiler juża biex jiddistingwi l-varjanti u jitqaggħal b'mod sigur.
=
| { : }
| { : ; : }
| { : ; : };
A discriminated (tagged) union huwa unjoni ta' tipi ta' oġġetti li kollha jaqsmu komuni literal field — il-discriminant — li l-compiler juża biex jiddistingwi l-varjanti u jitqaggħal b'mod sigur.
=
| { : }
| { : ; : }
| { : ; : };
Kull membru għandu status literal. Il-kontroll tiegħu jittartaq għal varjant wieħed biss, u jiftaħ il-fields ta' dak il-varjant:
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
}
}
If tipprova taċċessa r.data fil-każ loading, huwa compile error — is-sistema tat-tipi tagħmel kombinazzjonijiet invalidi ma jistgħux jiġu rappreżentati.
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;
}
}
L-assenjazzjoni never ittebgħalek tmexxu kull każ — żid status ġdid u l-compiler jurik kull switch li jeħtieġ ittajbid.
Discriminated unions huma l-mod idiomatiku biex timmudellja l-istati (loading/success/error), events/actions (Redux reducers), u ħafna data "wieħed minn diversi forom".
Huma jagħmlu l-istati illegali impossibbli u, bl-għodda never, jagħtuk compile-time exhaustiveness — rebħa ta' sigurtà enormi meta mqabbla mal-mudellazzjoni loosely boolean/optional-field.