🚀 إتقان تحديد الأنواع في TypeScript: الصريح مقابل المستنتج

بعد أن تعرفنا على أساسيات اللغة، حان الوقت لنفهم واحدة من أهم ميزات TypeScript، وهي كيف تتعامل اللغة مع "أنواع البيانات" (Types).

في TypeScript، لدينا طريقتان لإخبار المحرر (Editor) بنوع البيانات التي نستخدمها: إما أن نخبره نحن بشكل مباشر وصريح، أو نترك TypeScript "يخمن" النوع بناءً على القيمة التي وضعناها. لنشرح ذلك بالتفصيل وببساطة. 💡


أولاً: الأنواع الصريحة (Explicit Types) ✍️

الأنواع الصريحة تعني أنك كمبرمج تقوم بتحديد نوع المتغير "يدوياً" وبشكل واضح عند تعريف المتغير. نحن نستخدم هنا ما يسمى بـ Type Annotations (توصيفات الأنواع).

تتم عملية التحديد عن طريق وضع نقطتين رأسيتين : بعد اسم المتغير، ثم كتابة النوع المطلوب.

لماذا نستخدم الأنواع الصريحة؟

  1. الوضوح: أي شخص يقرأ الكود سيعرف فوراً ما هو نوع البيانات المتوقع.
  2. منع الأخطاء: تمنع TypeScript تغيير نوع المتغير لاحقاً بالخطأ.
  3. التوثيق الذاتي: الكود يشرح نفسه دون الحاجة لكتابة تعليقات كثيرة.

مثال عملي على الأنواع الصريحة:

// تحديد نوع المتغير كـ نص (string) بشكل صريح
let userName: string = "Ahmed"; 

// تحديد نوع المتغير كـ رقم (number) بشكل صريح
let userAge: number = 25; 

// تحديد نوع المتغير كـ قيمة منطقية (boolean) بشكل صريح
let isStudent: boolean = true; 

// محاولة تغيير النوع ستؤدي إلى خطأ فوراً من TypeScript
// userName = 100; // ❌ خطأ: لا يمكن تعيين رقم إلى متغير من نوع string

ثانياً: استنتاج الأنواع (Type Inference) 🔍

هل لاحظت أن كتابة النوع في كل مرة قد تكون مرهقة؟ هنا يأتي دور "الذكاء" في TypeScript. ميزة Type Inference تعني أن TypeScript تستطيع "استنتاج" نوع المتغير تلقائياً من القيمة التي تخصصها له عند البدء.

إذا قمت بتعريف متغير وأعطيته قيمة فوراً دون تحديد النوع، فإن TypeScript سيعتبر هذا المتغير من ذلك النوع للأبد.

كيف يعمل الاستنتاج؟

عندما تكتب let city = "Cairo"; فإن TypeScript يرى أن القيمة "Cairo" هي نص، فيقوم تلقائياً بتعيين نوع string لهذا المتغير في الخلفية.

مثال عملي على استنتاج الأنواع:

// هنا لم نكتب :string ولكن TypeScript استنتج النوع تلقائياً
let city = "Cairo"; 

// هنا استنتج TypeScript أن المتغير نوع رقم (number)
let price = 50; 

// هنا استنتج TypeScript أن المتغير نوع منطقي (boolean)
let isOpen = false; 

// حتى مع الاستنتاج، لا يمكنك تغيير النوع لاحقاً
// price = "Fifty"; // ❌ خطأ: لا يمكن تعيين نص إلى متغير استنتج أنه number

مقارنة سريعة: متى أستخدم هذا ومتى أستخدم ذاك؟ ⚖️

قد تتساءل الآن: "إذا كان TypeScript يستنتج الأنواع تلقائياً، فلماذا أتعب نفسي وأكتبها بشكل صريح؟". إليك الإجابة البسيطة:

الحالة الطريقة المفضلة السبب
عند تعريف متغير وإعطاؤه قيمة فورية استنتاج الأنواع (Inference) يجعل الكود أنظف وأسرع في الكتابة.
عند تعريف متغير بدون قيمة أولية الأنواع الصريحة (Explicit) لكي يعرف TypeScript نوع البيانات التي ستوضع في المتغير لاحقاً.
في المشاريع الكبيرة والمعقدة الأنواع الصريحة (Explicit) لضمان عدم حدوث أخطاء ولتسهيل مراجعة الكود من قبل المبرمجين الآخرين.

مثال على ضرورة التحديد الصريح:

إذا قمت بتعريف متغير دون قيمة، فإن TypeScript سيعطيه نوع any (أي شيء)، وهذا يقلل من قوة الحماية التي توفرها اللغة. لذا يجب تحديد النوع صراحة:

let score: number; // تحديد صريح لأننا لم نضع قيمة فورية

// الآن يمكننا إسناد قيمة في أي وقت لاحق
score = 95; // ✅ صحيح
// score = "Excellent"; // ❌ خطأ: يجب أن يكون القيمة رقماً

ملخص الدرس 📝

  • الأنواع الصريحة (Explicit Types): هي تحديد النوع يدوياً باستخدام : type.
  • استنتاج الأنواع (Type Inference): هي قدرة TypeScript على معرفة النوع من القيمة المسندة.
  • كلاهما يحقق هدفاً واحداً وهو "تأمين الكود" ومنع الأخطاء البرمجية قبل تشغيل البرنامج.

ماذا سنتعلم في الدرس القادم؟ 🤔

الآن بعد أن عرفنا كيف نحدد الأنواع البسيطة (String, Number, Boolean)، سننتقل إلى مستوى أكثر شمولاً. في الدرس القادم سنتعلم "Arrays and Tuples"، حيث سنعرف كيف نتعامل مع مجموعات من البيانات وكيف نحدد أنواع المصفوفات بدقة لضمان تنظيم أفضل لبياناتنا. نراك هناك! 👋