أخطاء المبتدئين في TypeScript من الألف إلى الياء
\n\nTypeScript هي أداة قوية تساعد في كتابة كود أكثر موثوقية وقابلية للتنبؤ. ومع ذلك، في البداية، يرتكب العديد من المطورين (خاصة أولئك القادمين من JavaScript) أخطاء نموذجية. في هذه المقالة، سنحلل أكثر 10 مشاكل شيوعًا التي يواجهها المبتدئون، ونوضح كيفية تجنبها. نغوص في عالم TypeScript من الألف إلى الياء.
\n\n1. الإفراط في استخدام any
\n\nهذا هو الخطأ الأكثر شيوعًا على الأرجح. عندما لا يعرف المطور نوع البيانات المتوقعة، يكتب any. هذا يقتل جوهر TypeScript بالكامل - التصنيف الثابت. تفقد تلميحات المحرر والحماية من الأخطاء أثناء التجميع.
مثال سيء:
\nfunction processData(data: any) {\n return data.name.toLowerCase(); // سيظهر الخطأ فقط في وقت التشغيل\n}\n\n\nكيفية الإصلاح: استخدم أنواعًا أكثر تحديدًا، أو unknown، أو الأدوية (Generics).
function processData(data: { name: string }) {\n return data.name.toLowerCase(); // سيتحقق TypeScript من ذلك في مرحلة التجميع\n}\n\n\nإذا كان النوع غير معروف حقًا، استخدم unknown - سيجبرك على التحقق من البيانات قبل الاستخدام.
2. تجاهل الوضع الصارم (strict mode)
\n\nيقوم العديد من المبتدئين بتعطيل strict: true في tsconfig.json لتجنب "الأخطاء الزائدة". هذا خطأ كبير. بدون الوضع الصارم، تفقد التحقق من null و undefined، مما يؤدي إلى ظهور Cannot read property of undefined في بيئة الإنتاج.
// بدون strict: true — لا يوجد خطأ\nconst name: string = null; // يعمل، لكنه سينهار لاحقًا\n\n// مع strict: true — خطأ في التجميع\nconst name: string = null; // ❌ Type 'null' is not assignable to type 'string'\n\n\nنصيحة: قم دائمًا بتفعيل strict: true. سينقذك من مئات الأخطاء.
3. الاستخدام غير الصحيح للأنواع والواجهات
\n\nغالبًا ما يخلط المبتدئون بين type و interface، ويستخدمونها في غير محلها. على سبيل المثال، يقومون بإنشاء واجهة لدالة واحدة، بينما يمكن وصف النوع مباشرة في المعامل.
مثال سيء:
\ninterface UserData {\n name: string;\n age: number;\n}\nfunction greet(user: UserData) {\n console.log(`Hello, ${user.name}`);\n}\n\n\nهذا زائد عن الحاجة إذا تم استخدام الواجهة مرة واحدة فقط.
\n\nالأفضل:
\nfunction greet(user: { name: string; age: number }) {\n console.log(`Hello, ${user.name}`);\n}\n\n\nاستخدم interface للكائنات التي يتم توسيعها أو تنفيذها بواسطة الفئات، و type للاتحادات (union) والتقاطعات (intersection).
4. نسيان أنواع الاتحاد (Union Types)
\n\nواحدة من أقوى ميزات TypeScript هي أنواع الاتحاد. غالبًا ما يكتب المبتدئون فحوصات زائدة أو يستخدمون any بينما يمكنهم ببساطة تحديد عدة أنواع مسموح بها.
// سيء\nfunction getLength(value: any) {\n return value.length;\n}\n\n// جيد\nfunction getLength(value: string | any[]) {\n return value.length;\n}\n\n\nسيقوم TypeScript نفسه بتوجيهك إلى الطرق المتاحة لكل نوع من أنواع الاتحاد.
\n\n5. أخطاء مع null و undefined
\n\nيتعامل TypeScript بصرامة مع null و undefined، لكن المبتدئين غالبًا ما ينسون التحقق منهما. يؤدي هذا إلى أخطاء في وقت التشغيل.
function printName(name: string | null) {\n console.log(name.toUpperCase()); // ❌ Object is possibly 'null'\n}\n\n\nكيفية الإصلاح: استخدم الفحوصات الوقائية (type guards):
function printName(name: stri