new () => T توقيعات الإنشاء
آخر تحديث: 2026-10-22
new () => T توقيعات الإنشاء
يصف توقيع الإنشاء new (name: string) => T «أن هذه القيمة يمكن إنشاء T منها بـ new». تحتاجه عند تمرير الفئات نفسها (لا النسخ) كمعاملات — فدوال المصنع وحقن التبعيات وأنظمة الإضافات كلها تعتمد عليه لتجريد «القدرة على إنشاء الأشياء».
| المجموعة | الدوال والأصناف |
|---|---|
| النوع | بناء الجملة |
| الوضع الصارم | غير مطلوب |
ℹ️ معلومة يحوّل المحرر لغة TypeScript إلى JavaScript ثم يشغّلها (بدون فحص أنواع)؛ راجع ناتج كل مثال لنتيجة فحص الأنواع.
📝 الصيغة
class Player {
constructor(public name: string, public hp = 100) {}
}
type PlayerCtor = new (name: string, hp?: number) => Player;
function spawn(Ctor: PlayerCtor, name: string, hp?: number): Player {
return new Ctor(name, hp);
}
⚙️ المعاملات
| new | بادئة توقيع الإنشاء: تعني أن هذا التوقيع يُستدعى بـ new لا باستدعاء عادي |
|---|---|
| (name: string, hp?: number) | معاملات الإنشاء: تتطابق موضعيًا مع معاملات مُنشئ الفئة |
| => Player | نوع ناتج الإنشاء: نوع نتيجة تعبير new |
القيمة المُعادة:نوع نتيجة تعبير new، أي النوع الواقع على يمين => في توقيع الإنشاء؛ وعادةً تمرره دوال المصنع كما هي كنوع إرجاع لها.
▶ مثال
عدّل الكود أدناه واضغط «جرّب» لرؤية نتيجة التحويل:
الناتج:
Ada hp=100, Ben hp=80
(مخرجات التشغيل بعد التحويل؛ تمرير فئة لا تتطابق معاملات مُنشئها مع spawn سيعطي خطأ ترجمة)
💡 نقاط مهمة
ℹ️ معلومة الفئة نفسها هي «القيمة» لتوقيع إنشائها: ما يُمرر إلى spawn هو مرجع فئة Player، ويحدث new داخل المصنع — وهذا هو التعبير النوعي لمبدأ «الفئات مواطن من الدرجة الأولى».
💡 تلميح المصنع العام new (...args: any[]) => T هو أصغر شكل لحقن التبعيات: مرر أي فئة واحصل على نسخة T؛ وعند أهمية معاملات المُنشئ الدقيقة استخدم InstanceType<typeof C>.
⚠️ تنبيه الفئات المجردة لا تحقق توقيعات الإنشاء المحددة (لا يمكن إنشاؤها بـ new مباشرةً)؛ ولوصف «الفئة أو فئاتها الفرعية» استخدم توقيع الإنشاء المجرد abstract new (...) => T.
🏷️ الدوال والأصناف ذات صلة
💡 حالات ذات صلة
المزيد من الحالات قادم قريبًا.
📚 دروس ذات صلة
❓ أسئلة شائعة
س ما الفرق بين توقيع الإنشاء و InstanceType<typeof Player>؟
ج typeof Player هو نوع «الفئة نفسها» ويحمل الأعضاء الساكنة ومعاملات المُنشئ الدقيقة؛ بينما new (...) => T يعد فقط «بإمكان الإنشاء إلى T» وهو أكثر تجريدًا. للدقة استخدم الأول، وللمصانع العامة استخدم الثاني.
س متى يكون توقيع الإنشاء ضروريًا؟
ج كلما مُررت «فئة» كقيمة إلى دالة: spawn(PlayerCtor, name)، أو تسجيل new StorageClass() في الحاوية، أو تحميل new Plugin() في نظام الإضافات. فالواجهات العادية تصف النسخ ولا تصف الفئة نفسها.
س كيف تُكتب مصنع عام يجمع بين العمومية وأمان النوع؟
ج function create<T>(Ctor: new (...args: any[]) => T, ...args: any[]): T { return new Ctor(...args); } — المعاملات الواسعة تشتري العمومية، وتظل قيمة الإرجاع T دقيقة.