T extends U قيود الأنواع العامة
آخر تحديث: 2026-10-22
T extends U قيود الأنواع العامة
يرسم القيد (extends) «حدودًا» لمعامل النوع: <T extends HasId> يعد بأن «T لديه على الأقل id: number». داخل القيد يمكنك الوصول إلى الأعضاء العلنيين لـ T باطمئنان، وخارجه (تمرير string) يُرفض فورًا في وقت الترجمة — فهو أأمن من any وأمرن من النوع المحدد.
| المجموعة | الأنواع العامة |
|---|---|
| النوع | بناء الجملة |
| الوضع الصارم | غير مطلوب |
ℹ️ معلومة يحوّل المحرر لغة TypeScript إلى JavaScript ثم يشغّلها (بدون فحص أنواع)؛ راجع ناتج كل مثال لنتيجة فحص الأنواع.
📝 الصيغة
interface HasId {
id: number;
}
function findById<T extends HasId>(items: T[], id: number): T | undefined {
return items.find((item) => item.id === id);
}
⚙️ المعاملات
| T extends HasId | القيد: يجب أن يكون نوع المعامل متوافقًا مع HasId (على الأقل id: number) |
|---|---|
| T | undefined | نوع الإرجاع يحفظ الشكل الدقيق للمعامل: الشكل الذي تمرره هو الشكل الذي تحصل عليه |
القيمة المُعادة:كما في الأنواع العامة غير المقيدة — يُحفظ النوع الدقيق للمعامل؛ والفرق أن الأعضاء المتاحين لـ T داخل جسم الدالة يزدادون.
▶ مثال
عدّل الكود أدناه واضغط «جرّب» لرؤية نتيجة التحويل:
الناتج:
Desk
غير موجود
(مخرجات التشغيل بعد التحويل؛ لا بأس في أن تحتوي عناصر products حقولًا إضافية — النظام النوعي البنيوي يفحص الأعضاء المطلوبة في القيد فقط)
💡 نقاط مهمة
ℹ️ معلومة القيد لا يشترط «التساوي التام»: فـ { id: 1, name: "Lamp", price: 59 } يبقى متوافقًا رغم الحقول الإضافية — النظام النوعي البنيوي يفحص الأعضاء المطلوبة في القيد فقط.
💡 تلميح القيد المضمّن يوفر الواجهة الوسيطة: function sumLengths<T extends { length: number }>(a: T, b: T) يصف مباشرةً «كل ما له length»؛ ولا يستحق إنشاء واجهة إلا القيد المعقد.
⚠️ تنبيه القيد يعطي «الحد الأدنى»: T extends HasId يضمن وجود id فقط، ولا يزال item.name غير موجود في نظر المترجم — إلا إذا أضفت قيدًا عليه أيضًا بـ name: string.
🏷️ الأنواع العامة ذات صلة
💡 حالات ذات صلة
المزيد من الحالات قادم قريبًا.
📚 دروس ذات صلة
❓ أسئلة شائعة
س هل يمكن الجمع بين القيد والقيمة الافتراضية للنوع العام؟
ج نعم وهو شائع: <T extends HasId = User> — عند الإغفال تُستخدم User الافتراضية، وعند التمرير يجب أن يوفى بـ HasId. ويجب أن تكون القيمة الافتراضية داخل نطاق القيد.
س كيف تقيّد «أن يكون أحد قيم حرفية محددة فقط»؟
ج باستخدام اتحاد القيم الحرفية: function set<K extends "light" | "dark">(theme: K). ستضيق K إلى القيم الحرفية، وأي قيمة خارجها خطأ ترجمة.
س كيف تُكتب قيود متبادلة بين عدة معاملات نوع؟
ج بجعل الأخير يشير إلى الأول: <K extends keyof T> — يتحدد نطاق K بـ T، وهذه جوهر نمط keyof الذي يضمن تطابق أسماء المفاتيح مع الكائن الفعلي.