A discriminated (tagged) union yra objektų tipų unija, kuri turi bendrą literalo lauką — diskriminantą — kurį kompiliatorius naudoja variantams atskirti ir saugiai susiaurinti.
=
| { : }
| { : ; : }
| { : ; : };
A discriminated (tagged) union yra objektų tipų unija, kuri turi bendrą literalo lauką — diskriminantą — kurį kompiliatorius naudoja variantams atskirti ir saugiai susiaurinti.
=
| { : }
| { : ; : }
| { : ; : };
Kiekvienas narys turi status literalą. Jo patikrinimas susiaurina tiksliai į vieną variantą, atrakindamas to varianto laukus:
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
}
}
Jei meginate pasiekti r.data loading atveju, tai yra kompiliacijos klaida — tipo sistema nevalidias kombinacijas daro neatstovadojamomis.
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 priskyrimas priimra jus tvarkyti kiekvieną atvejį — pridėkite naują būseną ir kompiliatorius nurodys jums kiekvienoje switch'oje, kuri reikalinga atnaujinti.
Diskriminuotos unijos yra idiomatiniu būdu modeliuoti būseną (loading/success/error), renginius/veiksmus (Redux reducers) ir bet kokius "vienas iš kelių formų" duomenis.
Jos daro negalimas neteisingas būsenas ir, su never triuku, suteikia jums kompiliacijos laiko išsamumą — didelį saugumo laimėjimą prieš atlaidų boolean/optional-field modeliavimą.