Generic Components المكوّنات العامة (Generics)

آخر تحديث: 2026-11-03

Generic Components المكوّنات العامة (Generics)

تُتابع المكوّنات العامة النوع مع البيانات: تَرسم function List<T> مصفوفة نصوص بـ T=string ومصفوفة كائنات بـ T=User. تكتبها مرة فيحصل كل نوع عنصر على استنتاج وتلميحات كاملة، وهي التقنية الجوهرية خلف مكتبات الواجهة القابلة لإعادة الاستخدام وطبقات البيانات. ويتوقف منطق المكوّن عن الاكتراث بشكل العناصر، فنفس الكود يخدم أي حمولة يمرّرها المستدعي.

المجموعةالبيانات والهندسة
النوعنمط

ℹ️ ملاحظة يحوّل المحرّر JSX إلى JavaScript ويعرض الواجهة الحقيقية داخل بيئة معزولة؛ تُركَّب المكوّنات تلقائياً دون استدعاء render يدوي.

📝 الصيغة

type ListProps<T> = {
  items: T[]
  renderItem: (item: T) => React.ReactNode   // the caller decides how to render
  keyOf?: (item: T) => string | number
}

function List<T>({ items, renderItem, keyOf }: ListProps<T>) {
  return (
    <ul>
      {items.map((it, i) => (
        <li key={keyOf ? keyOf(it) : i}>{renderItem(it)}</li>
      ))}
    </ul>
  )
}

// T is inferred automatically at the call site:
<List items={['a', 'b']} renderItem={s => s.toUpperCase()} />      // T = string
<List items={users} renderItem={u => u.name} keyOf={u => u.id} />   // T = User

القيمة المرجعة:لا قيمة مرجعة؛ إنها نمط برمجي وليست واجهة قابلة للاستدعاء.

▶ مثال

المثال يعمل مباشرة: يُعرض تلقائياً عند التوسيع وتظهر التعديلات فوراً.

الناتج:

ثلاث قوائم تعيد استخدام ذات GenericList لترسم نصوصًا وأرقامًا وكائنات — تجعل العوامل العامة منطق المكوّن منفصلًا عن نوع العنصر (عرض JSX وقت التشغيل، والأنواع تُستنتج في نسخة TypeScript).

💡 النقاط الأساسية

💡 نصيحة قيّد العام بـ <T extends { id: number }>: يجب وجود الحقل ويبقى T نوعه المحدّد، وهي أأمن بكثير من any.
ℹ️ ملاحظة مكوّنات عامة شائعة: جدول Table<T>، وقائمة منسدلة Select<T>، وطبقة API حيث request<T>() تُعيد Promise<T>.
⚠️ تحذير يُفسَّر العام <T> في دالة سهم كوسم JSX، فاكتب <T,> بفاصلة زائدة أو استخدم إعلان function بدلًا منه.
المزيد من الحالات قريباً.

📚 دروس ذات صلة

❓ الأسئلة الشائعة

س في أي خطوة يُحدَّد نوع المكوّن العام؟
ج عند الاستدعاء. مرّر items={['a']} فيثبّت TypeScript T إلى string، فيُفحَص منذئذ وسائط renderItem وقيمته العائدة مقابلها.
س ما الفرق الحقيقي عن any؟
ج any يسلّم الفحص ويفقد التلميحات من الطرفين، بينما يحفظ العام علاقة «مجهول لكن متّسق»: النوع الذي تمرّره هو ما تحصل عليه خارجًا.
س متى أحتاج فعلًا مكوّنًا عامًا؟
ج أكثر ما يكون في مكتبات الواجهة القابلة لإعادة الاستخدام (جداول ونماذج ومنتقيات) وطبقات البيانات؛ ومكوّن تكتبه مرتين وتتخلص منه لا يحتاج تعميمًا.
Web-Tutorial.com

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

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

100%