🚀 إتقان الدوال في TypeScript: دليلك الشامل والسهل

بعد أن تعرفنا في الدروس السابقة على أنواع البيانات وكيفية التعامل مع المتغيرات، حان الوقت لننتقل إلى واحد من أهم المفاهيم في أي لغة برمجة، وهي الدوال (Functions).

ببساطة، الدالة هي عبارة عن "كتلة من الكود" تقوم بمهمة محددة، ويمكننا استدعاؤها في أي وقت بدلاً من إعادة كتابة نفس الكود مراراً وتكراراً. ولكن في TypeScript، لدينا ميزة إضافية وهي القدرة على تحديد أنواع البيانات داخل هذه الدوال لضمان دقة الكود. 🛡️


🧩 ما هي الدالة (Function) وكيف نكتبها؟

في JavaScript العادية، يمكنك كتابة دالة دون تحديد أنواع البيانات، ولكن في TypeScript، نحن نهتم جداً بما يدخل إلى الدالة وما يخرج منها.

الهيكل الأساسي للدالة يتكون من:

  1. اسم الدالة.
  2. المعاملات (Parameters): وهي القيم التي تستقبلها الدالة.
  3. نوع القيمة المرجعة (Return Type): وهي القيمة التي تعيدها الدالة بعد التنفيذ.

لنلقِ نظرة على مثال بسيط جداً:

// دالة بسيطة تقوم بطباعة رسالة ترحيب
function sayHello(name: string): void {
    console.log("Hello " + name); // طباعة ترحيب بالاسم الممرر
}

// استدعاء الدالة
sayHello("Ahmed"); // Output: Hello Ahmed

شرح الكود:

  • name: string: هنا أخبرنا TypeScript أن المعامل name يجب أن يكون نصاً فقط. إذا حاولت تمرير رقم، سيعطيك البرنامج خطأً قبل تشغيل الكود! 🛑
  • : void: هذه الكلمة تعني أن الدالة لا تعيد أي قيمة، هي فقط تقوم بتنفيذ أمر (مثل الطباعة) ثم تنتهي.

🔢 التعامل مع العمليات الحسابية والقيم المرجعة

أحياناً نحتاج من الدالة أن تقوم بحساب شيء ما ثم "تعطينا" النتيجة لنستخدمها في مكان آخر. هنا نستخدم القيمة المرجعة بدلاً من void.

شاهد هذا المثال لجمع رقمين:

// دالة لجمع رقمين وتعيد النتيجة كـ number
function addNumbers(num1: number, num2: number): number {
    return num1 + num2; // إرجاع مجموع الرقمين
}

// تخزين النتيجة في متغير
let result: number = addNumbers(10, 20); 
console.log(result); // Output: 30

لماذا حددنا : number بعد الأقواس؟ لأننا نريد إجبار الدالة على إرجاع قيمة عددية فقط. هذا يمنع حدوث أخطاء منطقية في البرنامج مستقبلاً، حيث يضمن أن المتغير result سيتعامل دائماً مع رقم. 🧮


optional Parameters | المعاملات الاختيارية

في بعض الأحيان، قد يكون لدينا دالة تستقبل بيانات، ولكن بعض هذه البيانات قد لا تكون موجودة دائماً. في TypeScript، نستخدم علامة الاستفهام ? لجعل المعامل "اختيارياً".

إليك هذا المثال التوضيحي:

// دالة ترحيب، حيث يكون الاسم اختيارياً
function greetUser(name: string, greeting?: string): void {
    if (greeting) {
        console.log(greeting + " " + name); // إذا وجد الترحيب نستخدمه
    } else {
        console.log("Hello " + name); // إذا لم يوجد، نستخدم ترحيب افتراضي
    }
}

greetUser("Sara", "Welcome"); // Output: Welcome Sara
greetUser("Ali");             // Output: Hello Ali (تم تجاهل المعامل الثاني)

ملاحظة هامة: المعامل الاختياري يجب أن يكون دائماً في نهاية قائمة المعاملات، لا يمكن أن تضع معاملاً إجبارياً بعد معامل اختياري. ⚠️


💡 ملخص سريع لما تعلمناه:

  1. الدوال (Functions): تستخدم لتنظيم الكود ومنع التكرار.
  2. تحديد الأنواع: نحدد نوع كل معامل (Parameter) لضمان سلامة البيانات.
  3. القيمة المرجعة (Return Type): نحدد نوع القيمة التي تخرج من الدالة، ونستخدم void إذا كانت الدالة لا تعيد شيئاً.
  4. المعاملات الاختيارية: نستخدم ? لجعل بعض المدخلات غير إجبارية.