interface<T> الواجهات العامة

آخر تحديث: 2026-10-22

interface<T> الواجهات العامة

تعلّق الواجهة العامة معاملات النوع بعد اسمها (interface ApiResult<T>) وتفصل «شكل الحاوية» عن «ما يُحمَّل داخلها»: فـ ApiResult<UserBrief> و ApiResult<number[]> هما البنية نفسها بأنواع محتوى مختلفة. وتعتمد عليها الواجهات واستجابات API وهياكل التخزين في إعادة الاستخدام.

المجموعةالأنواع العامة
النوعبناء الجملة
الوضع الصارمغير مطلوب

ℹ️ معلومة يحوّل المحرر لغة TypeScript إلى JavaScript ثم يشغّلها (بدون فحص أنواع)؛ راجع ناتج كل مثال لنتيجة فحص الأنواع.

📝 الصيغة

interface ApiResult<T> {
  code: number;
  data: T;
}

// تدعم معاملات النوع المتعددة والقيم الافتراضية
interface Paginated<T, Page = number> {
  page: Page;
  items: T[];
}

⚙️ المعاملات

<T>معامل النوع: يُملأ بنوع محدد عند الاستخدام (ApiResult<UserBrief>)، أو يُستنتج من السياق
data: Tحقل المحتوى مرتبط بـ T: فـ res1.data هو UserBrief تلقائيًا، والقراءة والكتابة معًا خاضعتان للفحص

القيمة المُعادة:الواجهة العامة مفهوم على مستوى النوع ولا تنتج كود تشغيل؛ والنوع بعد التسمُّك (instance) يحدد أنواع قراءة/كتابة الحقول.

▶ مثال

عدّل الكود أدناه واضغط «جرّب» لرؤية نتيجة التحويل:

الناتج:

Ada admin 20

(مخرجات التشغيل بعد التحويل؛ إدخال رقم في res1.data أو الوصول إلى res2.data.name سيعطي خطأ ترجمة — فقد ثُبّت نوع T)

💡 نقاط مهمة

ℹ️ معلومة عند استخدام الواجهة العامة يجب تقديم معاملات النوع (إلا إذا كان لها قيمة افتراضية): فـ ApiResult وحدها حالة «غير متسمّكة»، واستخدامها كنوع متغير مباشرةً يعطي خطأ.
💡 تلميح في السيناريوهات المتداخلة ركّبها مباشرة: ApiResult<Paginated<Order>> طبقة فوق طبقة، وهو أوضح من تسطيح code/data/page/items يدويًا في بنية واحدة.
⚠️ تنبيه لا تجعلها عامة لأجل العمومية ذاتها: إذا استُخدمت الواجهة مرة واحدة بنوع ثابت فكتابة النوع المحدد مباشرةً أوضح؛ فقيمة الأنواع العامة هي إعادة استخدام الشكل نفسه لمحتويات متعددة.
المزيد من الحالات قادم قريبًا.

📚 دروس ذات صلة

❓ أسئلة شائعة

س كيف تختار بين الواجهة العامة واسم type العام؟
ج قدرتا التعبير متكافئتان تقريبًا. استخدم interface عند الحاجة إلى دمج التصريحات أو وراثة extends أو تحقيق فئة implements؛ واستخدم type عند الحاجة إلى الاتحاد أو أنواع المفاضلة أو التركيب الشرطي.
س ما الفرق بين النوع العام على طريقة الواجهة والنوع العام للواجهة نفسها؟
ج في interface Box<T> { open(): T } يُشترك T في كل الواجهة (جميع الـ T متطابقة في نسخة Box<string> نفسها)؛ أما في interface Maker { make<T>(): T } فيُحدد T لكل استدعاء على حدة. الأول «حاوية» والثاني «فعل».
س هل يمكن للواجهة العامة تقييد معاملات نوعها؟
ج نعم، وبالصيغة نفسها المتبعة في الدوال: interface KeyedStore<T extends { id: string }> { get(id: string): T | undefined } — والأنواع غير الموفية للقيد تعطي خطأ عند موضع الاستخدام.
Web-Tutorial.com

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

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

100%