Diskriminoitu (merkitty) liitto on objektityyppien liitto, joilla kaikilla on yhteinen literaaliarvo — diskriminaattori — jonka kääntäjä käyttää varianttien erottamiseen ja turvalliseen rajoittamiseen.
=
| { : }
| { : ; : }
| { : ; : };
Diskriminoitu (merkitty) liitto on objektityyppien liitto, joilla kaikilla on yhteinen literaaliarvo — diskriminaattori — jonka kääntäjä käyttää varianttien erottamiseen ja turvalliseen rajoittamiseen.
=
| { : }
| { : ; : }
| { : ; : };
Jokaisella jäsenellä on status-literaali. Sen tarkistus rajoittaa täsmälleen yhteen varianttiin, mikä avaa kyseisen variantin kentät:
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
}
}
Jos yrität käyttää r.data loading-tapauksessa, se on käännösvirhe — tyyppijärjestelmä tekee virheellisistä yhdistelmistä esittämättömia.
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-määritys pakottaa sinut käsittelemään jokaisen tapauksen — lisää uusi status ja kääntäjä osoittaa jokaiselle switch-lauseelle, joka on päivitettävä.
Diskriminoidut liitot ovat idiomatillinen tapa mallintaa tilaa (loading/success/error), tapahtumia/toimintoja (Redux reducers) ja kaikki "yksi useista muodoista" -data.
Ne tekevät laittomat tilat mahdottomiksi ja never-kikalla ne antavat sinulle kääntöaikaisen täydellisyyden tarkistuksen — valtavan turvallisuusvoiton jouhevaan boolean/valinnaisen kentän mallinnukseen verrattuna.