Ayrılmış (etiketli) union, hepsi ortak bir literal alan — ayırıcı — paylaşan nesne türlerinin birleşimidir; derleyici bunu varyantları ayırt etmek ve güvenli bir şekilde daraltmak için kullanır.
=
| { : }
| { : ; : }
| { : ; : };
Ayrılmış (etiketli) union, hepsi ortak bir literal alan — ayırıcı — paylaşan nesne türlerinin birleşimidir; derleyici bunu varyantları ayırt etmek ve güvenli bir şekilde daraltmak için kullanır.
=
| { : }
| { : ; : }
| { : ; : };
Her üye bir status literal'ine sahiptir. Kontrol ettiğinizde, tam olarak bir varyanta daraltılır ve bu varyantın alanlarının kilidini açar:
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
}
}
loading durumunda r.data'ya erişmeye çalışırsanız, bu bir derleme hatasıdır — tür sistemi geçersiz kombinasyonları gösterilemez hale getirir.
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 ataması her durumu işlemeye zorlar — yeni bir status ekleyin ve derleyici güncellenmesi gereken her switch'i gösterir.
Ayrılmış unionlar, durumu (loading/success/error), olayları/eylemleri (Redux reducers) ve "çeşitli şekillerden biri" verilerinizi modellemenin deyimsel yoludur.
Yasal olmayan durumları imkansız hale getirir ve never hilesiyle size derleme zamanı eksantriklik kontrolü verir — gevşek boolean/opsiyonel alan modellemesine kıyasla muazzam bir güvenlik kazancı.