يوم نموذجي لمطور TypeScript: كود، أخطاء ومراجعة

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

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

ابدأ الدورة

صباح الخير يا TypeScript: كيف يبدأ يوم المطور

\n\n

تخيل: الساعة 9:00 صباحاً. تفتح حاسوبك المحمول، تُحضّر قهوتك وترى في Telegram رسالة من زميل: "اسمع، لقد كتبت دالة أمس، لكن TypeScript يشتكي من النوع unknown. هل يمكنك المساعدة؟". مألوف؟ مرحباً بك في يوم عمل نموذجي لمطور TypeScript. إنه ليس مجرد كتابة كود - إنه فن الموازنة بين الكتابة الصارمة، المواعيد النهائية وإعادة الهيكلة التي لا تنتهي.

\n\n

في هذه المقالة سأريكم يوماً حقيقياً من حياة مطور على TypeScript: من اجتماع الصباح القصير إلى الالتزام المسائي. سترون أمثلة حية للكود، مشاكل نموذجية وطرق حلها. هيا بنا!

\n\n

الصباح: اجتماع قصير ومراجعة الكود

\n\n

9:30 — Daily standup

\n\n

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

\n\n

مثال: تناقشون كتابة الرد من الخادم. بدلاً من كتابة any، تقترح:

\n\n
interface ApiResponse<T> {\n  data: T;\n  error: string | null;\n  status: number;\n}\n\ntype User = {\n  id: string;\n  name: string;\n  email: string;\n};\n\n// الاستخدام\nconst response: ApiResponse<User[]> = await fetchUsers();\n
\n\n

الزملاء يومئون برؤوسهم - هذا هو النهج الصحيح. مطور TypeScript يعرف: الكتابة الجيدة هي نصف النجاح.

\n\n

10:00 — مراجعة الكود: نجد الأخطاء قبل أن تجدنا

\n\n

بعد الاجتماع القصير، تفتح طلب سحب من مطور مبتدئ. كتب دالة للتحقق من صحة البريد الإلكتروني. الكود يعمل، لكن TypeScript يلمح: Type 'string | undefined' is not assignable to type 'string'. تترك تعليقاً:

\n\n
// ❌ المشكلة: لم يتم معالجة null/undefined\nfunction validateEmail(input: string | null | undefined): boolean {\n  if (!input) return false;\n  const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n  return emailRegex.test(input);\n}\n\n// ✅ الحل: استخدام الحراس والربط الاختياري\nfunction validateEmail(input: unknown): input is string {\n  return typeof input === 'string' && \n         input.length > 0 && \n         /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(input);\n}\n
\n\n

تشرح: مطور TypeScript يفكر دائماً في الحالات الحدودية. الكتابة ليست عن القيود، بل عن الأمان.

\n\n

منتصف اليوم: كتابة الكود والعمل مع الأنواع العامة

\n\n

11:30 — المهمة الرئيسية لليوم: إعادة هيكلة الكود القديم

\n\n

تتولى وحدة JavaScript قديمة يجب إعادة كتابتها إلى TypeScript. هناك دالة تقبل "أي شيء" وتعيد "أي شيء". كلاسيكي:

\n\n
// 🚫 كود JS القديم\nfunction processData(data) {\n  if (data.type === 'user') {\n    return { id: data.id, name: data.name };\n  }\n  if (data.type === 'order') {\n    return { orderId: data.id, total: data.total };\n  }\n  return null;\n}\n
\n\n

تحوّل هذا إلى كود مكتوب بشكل صارم باستخدام الاتحادات المميزة:

\n\n
// ✅ نسخة TypeScript\ntype UserData = { type: 'user'; id: string; name: string };\ntype OrderData = { type: 'order'; id: string; total: number };\ntype InputData = UserData | OrderData;\n\ntype ProcessedResult<T> = T extends UserData \n  ? { id: string; name: string }\n  : T extends OrderData \n  ? { orderId: string; total: number }\n  : never;\n\nfunction processData<T extends InputData>(data: T): ProcessedResult<T> {\n  if (data.type === 'user') {\n    return { id: data.id, name: data.name } as ProcessedResult<T>;\n  }\n  return { orderId: data.id, total: data.total } as ProcessedResult<T>;\n}\n
\n\n

الآن TypeScript يستنتج بنفسه النوع الصحيح للنتيجة اعتماداً على بيانات الإدخال. الزملاء

المدونات

توصيات الكتب