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. والإشارات تتجه فقط نحو «المصرَّح به سابقًا» ولا يمكن العكس.
Web-Tutorial.com

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

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

100%