ما هو TypeScript ولماذا يجب أن أستخدمه بدلاً من JavaScript؟
\n\nإذا كنت قد ألقيت نظرة على Stack Overflow أو تحدثت مع مطورين أماميين ذوي خبرة، فمن المحتمل أنك سمعت هذا السؤال. لقد حصد آلاف المشاهدات ومئات الإجابات. لكن لنكن صادقين: معظم التفسيرات إما معقدة جداً أو سطحية على العكس.
\n\nاليوم سنحلل هذا الموضوع كما لو كنت جالساً بجانبي على نفس الطاولة. بدون مصطلحات معقدة، مع أمثلة حية وإجابة صادقة: هل يستحق المبتدئ تعلم TypeScript بدلاً من JavaScript؟
\n\nونعم، إذا كنت قادماً من Python - ستشعر وكأنك في بيتك. TypeScript يشبه إلى حد كبير Python مع تعليقات الأنواع، لكنه أكثر صرامة.
\n\nتاريخ موجز: لماذا تم اختراع TypeScript
\n\nJavaScript لغة مذهلة. تعمل في كل مكان: في المتصفح، على الخادم (Node.js)، وحتى في المركبات الفضائية (مزحة، لكنها قريبة). لكن لديها مشكلة كبيرة واحدة: إنها مرنة جداً.
\n\nتخيل أنك تكتب كوداً في JavaScript:
\n\nfunction add(a, b) {\n return a + b;\n}\n\nconsole.log(add(5, 10)); // 15\nconsole.log(add("5", 10)); // "510" — أوه!\nconsole.log(add(null, 10)); // 10 — ماذا؟\n\n\nهل ترى؟ نفس الدالة تتصرف بشكل مختلف اعتماداً على أنواع الوسائط. بالنسبة لسكريبت صغير، هذه ليست مشكلة. لكن عندما ينمو مشروعك إلى 50,000 سطر كود، تتحول هذه "المفاجآت" إلى ساعات من التصحيح.
\n\nفي عام 2012، أصدرت شركة Microsoft TypeScript — إضافة فوق JavaScript تضيف الكتابة الثابتة ومزايا أخرى. في جوهره، هو نفس JavaScript، لكن مع "حماية من الأخطاء".
\n\nTypeScript vs JavaScript: الاختلافات الرئيسية مع الأمثلة
\n\n1. الكتابة (Typing) — الورقة الرابحة
\n\nفي JavaScript يمكنك كتابة:
\n\nlet user = "آنا";\nuser = 42; // JavaScript لا يعترض\nuser = true; // هذا أيضاً طبيعي\n\n\nفي TypeScript تحدد النوع بوضوح:
\n\nlet user: string = "آنا";\nuser = 42; // خطأ! لا يمكن تعيين نوع 'number' لنوع 'string'\n\n\nوهذا ينقذ من أطنان من الأخطاء. خاصة عندما تعمل في فريق أو تعود إلى كودك بعد شهر.
\n\n2. الواجهات (Interfaces) — كمخططات للكائنات
\n\nفي JavaScript يمكنك إنشاء كائن بأي شكل:
\n\nfunction greet(person) {\n console.log(`مرحباً، ${person.name}! عمرك ${person.age} سنة.`);\n}\n\ngreet({ name: "إيفان", age: 25 }); // يعمل\ngreet({ name: "ماريا" }); // age غير معرف — لكن الكود سينفذ\ngreet({ fullName: "بيتر", years: 30 }); // name غير معرف — خطأ!\n\n\nفي TypeScript تنشئ واجهة — عقداً يجب أن يلتزم به الكائن:
\n\ninterface Person {\n name: string;\n age: number;\n}\n\nfunction greet(person: Person) {\n console.log(`مرحباً، ${person.name}! عمرك ${person.age} سنة.`);\n}\n\ngreet({ name: "إيفان", age: 25 }); // ✅\ngreet({ name: "ماريا" }); // ❌ الخاصية 'age' مفقودة\ngreet({ fullName: "بيتر", years: 30 }); // ❌ هذا ليس Person\n\n\nالآن لن تتمكن من تمرير الكائن الخطأ عن طريق الخطأ. سيكتشف المترجم الخطأ قبل تشغيل الكود.
\n\n3. الإكمال التلقائي والتوثيق
\n\nعند استخدام TypeScript في المحرر (VS Code، WebStorm)، تحصل على:
\n- \n
- الإكمال التلقائي — يقترح المحرر الخصائص والطرق \n
- توثيق مباشر في الكود — عند التمرير فوق الدالة، ترى المعاملات التي تقبلها \n
- أخطاء فورية — تسطير أحمر قبل التشغيل \n
هذا مثل القيادة بسيارة مع نظام ملاحة، وليس بخريطة ورقية.
\n\nلماذا يختار TypeScript حتى المبتدئون؟
\n\nإليك ما يقوله المطورون على Stack Overflow وفي المشاريع الحقيقية:
\n\nأخطاء أقل في الإنتاج
\nالدراسات