A discriminated (tagged) union वस्तु प्रकारहरूको union हो जसले सबै एक साझा literal फिल्ड साझा गर्छन् — discriminant — जो compiler ले variants लाई अलग गर्न र सुरक्षित रूपमा संकीर्ण गर्न प्रयोग गर्छ।
=
| { : }
| { : ; : }
| { : ; : };
A discriminated (tagged) union वस्तु प्रकारहरूको union हो जसले सबै एक साझा literal फिल्ड साझा गर्छन् — discriminant — जो compiler ले variants लाई अलग गर्न र सुरक्षित रूपमा संकीर्ण गर्न प्रयोग गर्छ।
=
| { : }
| { : ; : }
| { : ; : };
प्रत्येक सदस्यसँग status literal छ। यसलाई जाँच गरेर ठीक एकैवटा variant मा संकीर्ण हुन्छ, त्यो variant को फिल्डलाई अनलक गर्छ:
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 अवस्थामा r.data लाई पहुँच गर्न प्रयास गर्नुहुन्छ भने, यो compile error हो — प्रकार प्रणाली अवैध संयोजनहरूलाई प्रतिनिधित्व गर्न नसक्ने बनाउँछ।
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 असाइनमेन्ट तपाइँलाई प्रत्येक केस ह्यान्डल गर्न बाध्य गर्छ — नयाँ status थप गर्नुहोस् र compiler ले तपाइँलाई सबै switch देखाउँछ जुन अपडेट गर्न आवश्यक छ।
Discriminated unions अवस्था (loading/success/error), events/actions (Redux reducers), र कुनै पनि "एकमा बहु आकार" डेटा मोडेल गर्ने idiiomatic तरिका हो।
तिनीहरूले अवैध अवस्थाहरूलाई असम्भव बनाउँछन् र, never चालसँग, तपाइँलाई compile-time exhaustiveness दिन्छन् — ढिलो boolean/optional-field मोडलिङमा ठूलो सुरक्षा जीत।