أهم أخطاء مطوري TypeScript المبتدئين: من الألف إلى الياء

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

أهم أخطاء مطوري TypeScript المبتدئين: من الألف إلى الياء

TypeScript — أداة قوية تضيف الكتابة الثابتة (Static Typing) إلى JavaScript، مما يجعل الكود أكثر قابلية للتنبؤ وأمانًا. ومع ذلك، غالبًا ما يصاحب الانتقال من JS إلى TS أخطاء نموذجية قد تلغي جميع مزايا الكتابة الصارمة. في هذه المقالة، سنستعرض أكثر الأخطاء شيوعًا بين مطوري TypeScript المبتدئين — من الإفراط في استخدام any إلى التعامل غير الصحيح مع null و undefined. ستتعلم كيفية تجنبها وكتابة كود نظيف وموثوق.



1. الإفراط في استخدام النوع any

الخطأ الأكثر شيوعًا بين المبتدئين هو استخدام any في كل مكان حيث "لا نريد التفكير". TypeScript صُمم للأنواع، و any يعطل التحقق تمامًا.

// ❌ سيءfunction processData(data: any) {  return data.length; // خطأ أثناء التنفيذ إذا كان data رقمًا}

// ✅ جيدfunction processData(data: string | unknown[]) { return data.length; // سيتحقق TypeScript من أن data لها خاصية length}

نصيحة: استخدم unknown بدلاً من any إذا كان النوع غير معروف حقًا. احرص دائمًا على استخدام أنواع محددة.



2. تجاهل strictNullChecks

بشكل افتراضي، strictNullChecks مفعل، لكن العديد من المبتدئين يعطلونه "للبساطة". يؤدي هذا إلى أخطاء وقت التنفيذ.

// ❌ سيء (إذا كان strictNullChecks: false)let name: string = null; // يعمل، لكنه سيسبب خطأ لاحقًا

// ✅ جيدlet name: string | null = null; // نحدد بوضوح إمكانية nullif (name !== null) { console.log(name.toUpperCase());}

نصيحة: لا تقم أبدًا بتعطيل strictNullChecks. استخدم Optional Chaining (?.) و Nullish Coalescing (??) للعمل الآمن مع null/undefined.



3. الاستخدام غير الصحيح لأنواع المصفوفات

الخلط بين Array<T> و T[] أمر طبيعي، لكن الخطأ الرئيسي هو عدم تحديد نوع العناصر.

// ❌ سيءlet items = []; // النوع any[]items.push(1);items.push("hello"); // يعمل، لكننا نفقد السيطرة

// ✅ جيدlet items: number[] = []; // أرقام فقطlet strings: Array<string> = []; // كتابة بديلة

نصيحة: قم دائمًا بتعريف نوع المصفوفة، خاصة إذا كانت فارغة عند التصريح. استخدم readonly لتحقيق الثبات (Immutability).



4. الكتابة غير الصحيحة للدوال و callback

غالبًا ما ينسى المبتدئون كتابة أنواع معاملات الدوال أو يستخدمون Function كنوع.

// ❌ سيءfunction fetchData(callback: Function) {  callback("data", 123);}fetchData((err: string, data: number) => {}); // خطأ: متوقع وسيطين

// ✅ جيدfunction fetchData(callback: (err: string | null, data: number) => void) { callback(null, 123);}

نصيحة: قم بكتابة أنواع المعاملات وقيمة الإرجاع بشكل صريح. بالنسبة لـ callback، استخدم أنواع الأسهم (Arrow Types) أو type/interface.



5. الخلط بين interface و type

كثيرون لا يفهمون الفرق ويستخدمونها بالتبادل، مما قد يؤدي إلى أخطاء.

// interface — يمكن دمجه (declaration merging)interface User {  name: string;}interface User {  age: number;} // يعمل

// type — لا يمكن دمجه، لكن يمكن إنشاء union/intersectiontype Status = "active" | "inactive";type Admin = User & { role: "admin" };

نصيحة: استخدم interface للكائنات التي قد تتوسع (مثلًا في المكتبات). استخدم type لأنواع union، و tuples، والتركيبات المعقدة.



6. تجاهل readonly و const

المدونات

توصيات الكتب