Diskriminirana (označena) unija je unija tipova objekata koje sve dijele zajedničko doslovno polje — diskriminator — koji kompajler koristi kako bi razlikovao varijante i sigurno sužio.
=
| { : }
| { : ; : }
| { : ; : };
Diskriminirana (označena) unija je unija tipova objekata koje sve dijele zajedničko doslovno polje — diskriminator — koji kompajler koristi kako bi razlikovao varijante i sigurno sužio.
=
| { : }
| { : ; : }
| { : ; : };
Svaki član ima doslovno status polje. Provjera njega sužava na točno jednu varijantu, otključavajući polja te varijante:
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
}
}
Ako pokušate pristupiti r.data u slučaju loading, to je greška pri kompajliranju — sustav tipova čini nevaljane kombinacije nereprezentabilnim.
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;
}
}
Dodjela never vas prisiljava da obradite svaki slučaj — dodajte novi status i kompajler vas upućuje na svaki switch koji trebate ažurirati.
Diskriminirane unije su idiomatski način za modeliranje stanja (učitavanje/uspjeh/greška), događaja/radnji (Redux reduceri), i svih "jedan od nekoliko oblika" podataka.
Čine nelegalna stanja nemogućima i, sa trikkom never, vam daju provjeru iscrpnosti pri kompajliranju — ogroman sigurnosni dobitak u odnosu na labavo boolean/optional-field modeliranje.