T = Default القيم الافتراضية للأنواع العامة
آخر تحديث: 2026-10-22
T = Default القيم الافتراضية للأنواع العامة
يمكن لمعاملات الأنواع أن تملك قيمًا افتراضية (<T = string>): عند عدم التحديد يُعتمد النوع الافتراضي تلقائيًا، وعند التحديد يُستخدم المحدَّد. وهي الفكر نفسه لمعاملات الدوال الافتراضية — «صفر إعداد للسيناريوهات الشائعة، وقابل للتجاوز في السيناريوهات الخاصة» — مما يجعل واجهات API العامة أكثر سهولة.
| المجموعة | الأنواع العامة |
|---|---|
| النوع | بناء الجملة |
| الوضع الصارم | غير مطلوب |
ℹ️ معلومة يحوّل المحرر لغة TypeScript إلى JavaScript ثم يشغّلها (بدون فحص أنواع)؛ راجع ناتج كل مثال لنتيجة فحص الأنواع.
📝 الصيغة
interface Paginated<T = string, Page = number> {
page: Page;
items: T[];
}
const names: Paginated = { page: 1, items: ["ann", "bob"] }; // تستخدم الافتراضيات
const orders: Paginated<{ id: number; total: number }> = { page: 2, items: [] }; // تتجاوز T
⚙️ المعاملات
| T = string | معامل نوع بقيمة افتراضية: يمكن إغفاله كليًا عند الاستخدام |
|---|---|
| Page = number | المعامل الثاني له قيمة افتراضية أيضًا: عند تجاوز Page يجب كتابة T أولًا حسب الموضع |
القيمة المُعادة:تؤثر القيمة الافتراضية فقط في «أي نوع يُستخدم عند إغفال التسمُّك»؛ وسلوك النوع بعد التسمُّك متطابق تمامًا مع الحالة المحددة صراحةً.
▶ مثال
عدّل الكود أدناه واضغط «جرّب» لرؤية نتيجة التحويل:
الناتج:
ann,bob 2 7
(مخرجات التشغيل بعد التحويل؛ إدخال سلسلة نصية في orders.items سيعطي خطأ ترجمة — فقد جُعلت T كائن الطلب)
💡 نقاط مهمة
ℹ️ معلومة يمكن أن تكون القيمة الافتراضية أي تعبير نوع: نوع محدد (string)، أو معامل آخر (T = Page[])، بل ونوعًا شرطيًا — فالقيمة الافتراضية ذاتها قادرة على إجراء عمليات على مستوى النوع.
⚠️ تنبيه تُملأ معاملات الأنواع حسب الموضع: لتجاوز المعامل الثاني (Page) يجب كتابة المعامل الأول (T) معه (بقيمته الافتراضية أو قيمة بديلة).
💡 تلميح الأنواع العامة في المكتبات العامة يجب أن تحمل قيمًا افتراضية في شبه كل الحالات (مثل Paginated<T = unknown>) فيتمكن المبتدئون من البدء دون فهم معاملات النوع، ويحدد المتقدمون بدقة في أي وقت.
🏷️ الأنواع العامة ذات صلة
💡 حالات ذات صلة
المزيد من الحالات قادم قريبًا.
📚 دروس ذات صلة
❓ أسئلة شائعة
س ما الضوابط عند استخدام القيمة الافتراضية مع القيد معًا؟
ج يجب أن توفّي القيمة الافتراضية بالقيد: <T extends HasId = User> قانونية (User متوافقة مع HasId)، بينما <T extends HasId = string> تعطي خطأ. فالقيمة الافتراضية «نوع محدد احتياطي» والقيد «بوابة الدخول».
س متى تدخل القيمة الافتراضية للفئة العامة حيز التنفيذ؟
ج عند new Stack() بلا معاملات ولا شيء للاستدلال منه: فـ class Stack<T = string> مع new Stack() تعطي Stack<string>؛ وإذا مُررت معاملات المُنشئ فالاستدلال مقدَّم على الافتراضي.
س هل يمكن للقيمة الافتراضية أن تشير إلى معاملات النوع السابقة؟
ج نعم: interface Pair<K = string, V = K[]> — الافتراضي لـ V هو مصفوفة من K. والإشارات تتجه فقط نحو «المصرَّح به سابقًا» ولا يمكن العكس.