الاتحاد المميز (union مع علامة) هو اتحاد من أنواع الكائنات التي تشترك جميعها في حقل حرفي مشترك — المميز — الذي يستخدمه المترجم لتمييز البدائل بأمان وتضييق النطاق.
=
| { : }
| { : ; : }
| { : ; : };
الاتحاد المميز (union مع علامة) هو اتحاد من أنواع الكائنات التي تشترك جميعها في حقل حرفي مشترك — المميز — الذي يستخدمه المترجم لتمييز البدائل بأمان وتضييق النطاق.
=
| { : }
| { : ; : }
| { : ; : };
كل عضو له حقل 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
}
}
إذا حاولت الوصول إلى r.data في حالة loading، فسيكون خطأ في وقت الترجمة — نظام النوع يجعل المجموعات غير الصحيحة غير قابلة للتمثيل.
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 يحتاج إلى تحديث.
الاتحادات المميزة هي الطريقة الاصطلاحية لنمذجة الحالة (loading/success/error)، والأحداث/الإجراءات (Redux reducers)، وأي بيانات "واحدة من عدة أشكال".
تجعل الحالات غير القانونية مستحيلة وتزودك، باستخدام حيلة never، بالتحقق من الاستنزاف في وقت الترجمة — وهو فوز أماني ضخم على النمذجة الفضفاضة بـ boolean/الحقول الاختيارية.