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 } — والأنواع غير الموفية للقيد تعطي خطأ عند موضع الاستخدام.