TypeScript / الأساسي / الدرس 4
الدوال والعقود وردود النداء
عبّر عن علاقات الوسائط والنتائج وميّز الإدخال الاختياري من غياب الفحص ومرّر السلوك بردود نداء مناسبة.
في هذه الصفحة
أهداف الدرس
- استخدام أنواع المعاملات والإرجاع والاختيار والافتراضي والباقي.
- تحديد أنواع الردود دون ضمانات غير مثبتة.
- اختيار الاتحادات أو التحميل الزائد وفق العقد.
يصف التوقيع الاستدعاءات المسموحة
يربط نوع الدالة المعاملات بالنتيجة. يستنتج الفاحص الإرجاع غالبًا وتوثق المعلمة العامة حدًا ثابتًا وتكشف التغيير العرضي. لا تصف الأنواع كل شرط؛ فقد يكون المقسوم عليه صفرًا وقد يرمي الرد. وثّق الوحدات والحدود والآثار والفشل. فضّل دوال صغيرة بمدخلات ومخرجات واضحة بدل حالة عامة خفية. يعني القبول ملاءمة العقد الساكن لا نجاح كل عملية تنفيذية.
إعطاء الافتراضي عملية تنفيذية
يمكن إغفال المعامل الاختياري فيكون undefined حتى معالجته. يعمل الافتراضي عند الإغفال أو undefined لا null تلقائيًا. يقدم المثال بادئة افتراضية وإرجاعًا صريحًا. تجمع معاملات الباقي الوسائط في مصفوفة بنوع مناسب. لا تجعل وسيط الرد اختياريًا لمجرد أن بعض الردود تتجاهله؛ فهذا يسمح لمستدعيه بإغفاله. ميّز الإغفال من قيمة فشلت في الفحص.
export {};
function greeting(name: string, prefix = "Hi"): string {
return `${prefix}, ${name}`;
}
console.log(greeting("Mira"));
console.log(greeting("Omar", "Welcome"));
Hi, Mira
Welcome, Omar
يستخدم الأول Hi ويستبدلها الثاني، ويُنشأ النص بأسلوب JavaScript العادي.
تمرير قدرة بإدخال دقيق
تقبل الدالة ردًا يحول عددًا إلى آخر وتستدعيه لكل عنصر وتعيد مصفوفة جديدة دون تعديل الإدخال. يأتي السلوك من التنفيذ لا النوع وحده. قد يغلق الرد على حالة أو يجري إدخالًا أو يرمي. استخدم readonly لمنع التعديل عبر هذا المسار، ولا يعني ذلك تجميد كل اسم مشترك للمصفوفة.
export {};
function transform(values: readonly number[], operation: (value: number) => number): number[] {
return values.map(operation);
}
const original = [1, 2, 3];
const result = transform(original, value => value * 2);
console.log(JSON.stringify(result), JSON.stringify(original));
[2,4,6] [1,2,3]
تضاعف النتيجة كل مدخل، وينشئ التنفيذ مصفوفة جديدة ويحفظ الأصل.
عدم خلط النتيجة المتجاهلة بالمستحيلة
يعني رد void تجاهل المستهلك للنتيجة وقد يقبل دالة تعيد قيمة؛ فلا يضمن undefined فعلية. تصف never عدم العودة الطبيعية كالرمي الدائم. يصف التحميل الزائد علاقات مدخل ونتيجة، ويرى المستدعي التواقيع المعلنة لا التنفيذ. فضّل معامل اتحاد إذا اتحد نوع النتيجة ووضح التنفيذ؛ فقد تعرقل تواقيع زائدة استدعاءً باتحاد مشروع.
توثيق الاستدعاء والفشل
اذكر فورية الرد أو تخزينه وتكراره وانتشار خطئه. لا تصير الدالة غير متزامنة بمجرد قبول رد، ولا يثبت Promise الإلغاء أو التوازي. يفحص strictFunctionTypes إسنادات كثيرة بدقة ولتوافق الأساليب استثناءات لاحقًا. اختبر الإغفال والافتراضي والفراغ وفشل الرد. لا تفرض بالتأكيد أو any ردًا يحتاج إدخالًا أضيق مما يستطيع المستدعي تقديمه.
الأخطاء الشائعة وإصلاحها
وسيط رد اختياري يصبح undefined.
- لماذا يحدث؟
- استخدم الاختيار للدلالة على جواز تجاهل قيمة لازمة.
- كيف تصلحه؟
- أبقِ المعامل المقدم لازمًا ودع الرد يتجاهله.
- كيف تتجنب تكراره؟
- اقرأ الاختيار من منظور مستدعي الرد.
رد void يعيد عددًا فعلًا.
- لماذا يحدث؟
- خُلط تجاهل النتيجة بمنع قيمة تنفيذية.
- كيف تصلحه؟
- حدّد عقد النتيجة إذا كان مهمًا.
- كيف تتجنب تكراره؟
- ميّز void وundefined وnever.
تحميل زائد يرفض وسيط اتحاد صالحًا.
- لماذا يحدث؟
- لا يقبل توقيع مرئي الاتحاد كاملًا.
- كيف تصلحه؟
- استخدم توقيع اتحاد مناسبًا أو تصميمًا مقصودًا.
- كيف تتجنب تكراره؟
- اختبر المدخلات المستنتجة والاتحادية.
اختبر فهمك
1. استدع greeting("Mira", undefined) واشرح الناتج واختلاف null مع الفحص الصارم.
اعرض الحل المشروح
الناتج Hi, Mira لأن undefined تفعل الافتراضي. ليست null ضمن النوع فتُرفض؛ ولا يجعل تجاوز الرفض null تفعل الافتراضي أثناء التنفيذ. إذا دعمتها فمثّلها وعالجها بدل إسكات الخطأ.
2. حوّل مصفوفة فارغة ثم اشرح رمي الرد عند ثاني عنصر في إدخال غير فارغ.
اعرض الحل المشروح
ينتج الفراغ مصفوفة جديدة فارغة دون ردود. إذا رمى map فلا تعود النتيجة الطبيعية وينتشر الخطأ حتى معالجته. يحفظ التنفيذ الأصل، ولا يتراجع تلقائيًا عن آثار خارجية أحدثها الرد قبل الرمي.
أهم ما تعلمته
- تصف التواقيع الاستدعاءات لا كل السلوك.
- اقصد الاختيار والتعديل وردود النداء.
- استخدم التحميل الزائد إذا أفاد المستدعي.