unknown مقابل any في TypeScript: أيهما تختار في عام 2025؟

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

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

ابدأ الدورة

مقدمة: لماذا فجر هذا الموضوع Stack Overflow؟

\n

إذا كنت قد كتبت أي كود بلغة TypeScript من قبل، فبالتأكيد واجهت المعضلة: unknown أم any؟ السؤال الذي جمع آلاف المشاهدات على Stack Overflow، لا يزال ذا صلة في عام 2025. يبدو أن كلا النوعين يسمحان بتخزين أي شيء - فما الفرق إذن؟

\n\n

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

\n\n

لن نعيد سرد الوثائق فقط. سنعرض حالات واقعية من ممارسات عام 2025، ونحلل أفضل الممارسات، ونقدم خوارزمية واضحة للاختيار. هيا بنا!

\n\n

ما هو any ولماذا يخاف منه الجميع؟

\n\n

any هو النوع الأكثر "مرونة" في TypeScript. إنه يقول حرفيًا للمترجم: "عطل نظام الأنواع، أنا أعرف ما أفعله". يبدو وكأنه قوة خارقة، لكنه في الواقع قنبلة موقوتة.

\n\n

مثال: كيف يكسر any الأنواع

\n
function processUser(user: any) {\n    console.log(user.name.toUpperCase()); // خطأ في وقت التشغيل إذا كان user يساوي null\n}\n\nprocessUser(null); // TypeError: Cannot read property 'toUpperCase' of null
\n\n

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

\n\n

متى يكون any مفيدًا على أي حال؟

\n
    \n
  • الترحيل من JavaScript: عندما تعيد كتابة مشروع قديم، any هو حل مؤقت.
  • \n
  • البيانات الديناميكية: مثل الردود من واجهات برمجة التطبيقات الخارجية (API) حيث يتغير الهيكل.
  • \n
  • الاختبارات: في النماذج الوهمية (mocks)، يكون استخدام any أسهل أحيانًا من وصف الأنواع المعقدة.
  • \n
\n\n

لكن تذكر: any يشبه بطاقة ائتمان بحد غير محدود. إنها مريحة حتى يحين موعد الدفع.

\n\n

Unknown: حارس صارم عند المدخل

\n\n

ظهر unknown في TypeScript 3.0 كبديل آمن لـ any. يمكنه أيضًا احتواء أي قيمة، لكنه يمنع التعامل معها دون فحص صريح. إنه نوع حاوية يتطلب التحقق.

\n\n

مثال: unknown في العمل

\n
function processUser(user: unknown) {\n    // خطأ في الترجمة! الخاصية 'name' غير موجودة في النوع 'unknown'\n    // console.log(user.name.toUpperCase()); \n    \n    // نحتاج إلى فحص\n    if (user && typeof user === 'object' && 'name' in user) {\n        const typedUser = user as { name: string };\n        console.log(typedUser.name.toUpperCase()); // كل شيء بخير\n    }\n}\n\nprocessUser({ name: "Alice" }); // ALICE\nprocessUser(null); // لن يحدث شيء
\n\n

هل لاحظت الفرق؟ unknown لا يسمح لك بإطلاق النار على قدمك. أنت ملزم بفحص النوع قبل الاستخدام. هذا هو الكتابة الآمنة.

\n\n

مقارنة any مقابل unknown في جدول

\n\n

لترسيخ المادة، دعنا نلقي نظرة على الاختلافات الرئيسية:

\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
المعيارanyunknown
تعيين أي قيمة✅ نعم✅ نعم
الوصول إلى الخصائص دون فحص✅ نعم❌ لا
التعيين لنوع آخر✅ لأي نوع❌ فقط any أو unknown
الحماية من أخطاء وقت التشغيل❌ لا✅ نعم (يتطلب فحصًا)
\n\n

كما ترى، unknown يفوز

المدونات

توصيات الكتب