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 الذي يضمن تطابق أسماء المفاتيح مع الكائن الفعلي.
Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%