ایک discriminated (tagged) union اعتراض کی اقسام کا اتحاد ہے جو سب ایک عام لفظی فیلڈ — discriminant — کو شیئر کرتے ہیں جو کمپائلر متغیرات کو الگ کرنے اور محفوظ طریقے سے سکڑانے کے لیے استعمال کرتا ہے۔
=
| { : }
| { : ; : }
| { : ; : };
ایک discriminated (tagged) union اعتراض کی اقسام کا اتحاد ہے جو سب ایک عام لفظی فیلڈ — discriminant — کو شیئر کرتے ہیں جو کمپائلر متغیرات کو الگ کرنے اور محفوظ طریقے سے سکڑانے کے لیے استعمال کرتا ہے۔
=
| { : }
| { : ; : }
| { : ; : };
ہر رکن کے پاس ایک status لفظی ہے۔ اسے چیک کرنے سے بالکل ایک متغیر تک محدود ہو جاتا ہے، اس متغیر کے فیلڈز کو کھول دیتا ہے:
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 شامل کریں اور کمپائلر ہر switch کی طرف اشارہ کرتا ہے جسے تبدیل کرنے کی ضرورت ہے۔
Discriminated unions حالت (loading/success/error)، واقعات/اقدامات (Redux reducers)، اور کسی بھی "متعدد اشکال میں سے ایک" ڈیٹا کو ماڈل کرنے کا عام طریقہ ہے۔
وہ غیر قانونی حالات کو ناممکن بناتے ہیں اور never کی تدبیر کے ساتھ، آپ کو compile-time مکمل تری کی جانچ دیتے ہیں — loose boolean/optional-field modeling کے مقابلے میں ایک بہت بڑی حفاظتی جیت۔
تفصیلی جوابات کے ساتھ IT انٹرویو سوالات کی ایک لائبریری — جونیئر سے سینئر تک۔
عطیہ دیں