Avatar ·

أنواع `unknown` و `any` في TypeScript: ما الفرق ومتى تستخدم كلًا منهما؟

مرحبًا بالجميع! لقد بدأت مؤخرًا في تعلم TypeScript وواجهت نوعين يبدوان متشابهين جدًا للوهلة الأولى: `any` و `unknown`. كلاهما يسمح بتخزين قيم من أي نوع، لكني أشعر أن هناك فرقًا مهمًا بينهما أفتقده. على سبيل المثال، أكتب دالة تستقبل بيانات من API. لا أعرف مسبقًا ما الذي سيأتي بالضبط — قد يكون كائنًا أو سلسلة نصية أو رقمًا. إليك كيف أفعل ذلك حاليًا: ```typescript function processData(data: any) { console.log(data.toUpperCase()); // يعمل بدون أخطاء، لكنه قد يفشل في وقت التشغيل } ``` لكن إذا حاولت استخدام `unknown`، أحصل على خطأ: ```typescript function processDataSafe(data: unknown) { console.log(data.toUpperCase()); // خطأ: الكائن من نوع 'unknown' } ``` لماذا يحدث هذا؟ يبدو أن كلا النوعين يسمحان بتخزين أي شيء، لكن `unknown` يتصرف بشكل أكثر صرامة. قرأت أن `unknown` هو بديل آمن من ناحية الكتابة (type-safe) لـ `any`، لكنني لا أفهم تمامًا ما يعنيه ذلك عمليًا.