صباح الخير يا TypeScript: كيف يبدأ يوم المطور
\n\nتخيل: الساعة 9:00 صباحاً. تفتح حاسوبك المحمول، تُحضّر قهوتك وترى في Telegram رسالة من زميل: "اسمع، لقد كتبت دالة أمس، لكن TypeScript يشتكي من النوع unknown. هل يمكنك المساعدة؟". مألوف؟ مرحباً بك في يوم عمل نموذجي لمطور TypeScript. إنه ليس مجرد كتابة كود - إنه فن الموازنة بين الكتابة الصارمة، المواعيد النهائية وإعادة الهيكلة التي لا تنتهي.
\n\nفي هذه المقالة سأريكم يوماً حقيقياً من حياة مطور على TypeScript: من اجتماع الصباح القصير إلى الالتزام المسائي. سترون أمثلة حية للكود، مشاكل نموذجية وطرق حلها. هيا بنا!
\n\nالصباح: اجتماع قصير ومراجعة الكود
\n\n9:30 — Daily standup
\n\nاجتماع قصير مع الفريق. تقول: "بالأمس أنهيت وحدة المصادقة، اليوم أخطط للتعامل مع كتابة الردود من API". وتسمع فوراً: "ألا تريد استخراج الواجهات في ملف منفصل؟ لدينا أسلوب كود". مطور TypeScript يفكر دائماً بخطوة للأمام: واجهات، أنواع عامة، أنواع مساعدة.
\n\nمثال: تناقشون كتابة الرد من الخادم. بدلاً من كتابة any، تقترح:
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\n10:00 — مراجعة الكود: نجد الأخطاء قبل أن تجدنا
\n\nبعد الاجتماع القصير، تفتح طلب سحب من مطور مبتدئ. كتب دالة للتحقق من صحة البريد الإلكتروني. الكود يعمل، لكن TypeScript يلمح: Type 'string | undefined' is not assignable to type 'string'. تترك تعليقاً:
// ❌ المشكلة: لم يتم معالجة 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\n11: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 يستنتج بنفسه النوع الصحيح للنتيجة اعتماداً على بيانات الإدخال. الزملاء