Kodokon kodokon.com

الاستنتاج، any و unknown

دع TypeScript يستنتج الأنواع بالاستنتاج، وافهم لماذا يتفوّق unknown على any الخطير.

8 دقيقة · 3 أسئلة

افتح هذا الدرس في Kodokon

خبر سار: لست مضطرًا لوضع تعليق لكل متغيّر. بفضل استنتاج الأنواع (type inference)، يستنتج TypeScript نوع المتغيّر من القيمة التي تعطيها له. كتابة let city = "Lyon" تكفي: يعلم TypeScript أن city من النوع string ويحميه كما لو أنك وضعت له تعليقًا.

TYPESCRIPT
let city = "Lyon"; // inferred type: string
let count = 3;     // inferred type: number

count = count + 1; // accepted
// city = 42; -> error: city is still a string
بلا تعليقات، ومع ذلك فالأنواع كلها موجودة.

النوع any يعني "أي شيء". المتغيّر من نوع any يفلت من كل عمليات التحقق: يقبل TypeScript كل شيء، دون تدقيق. الأمر أشبه بخلع حزام الأمان: تُصرَّف الشيفرة، لكن الأخطاء تعود أثناء التشغيل - وهو بالضبط ما كان من المفترض أن يمنعه TypeScript.

TYPESCRIPT
let data: any = "hello";
data = 42; // accepted without complaint

// Compiles, but crashes at runtime:
// data.toUpperCase() does not exist on a number!
مع any، يغضّ TypeScript الطرف.

بالنسبة لقيمة نوعها مجهول فعلًا (استجابة خادم، إدخال مستخدم)، فضّل unknown. مثل any، يقبل أي قيمة، لكنه يجبرك على التحقق من النوع (مثلًا بـ typeof) قبل استخدامه. وبذلك يبقى الأمان سليمًا.

TYPESCRIPT
let value: unknown = "hello";

// console.log(value.toUpperCase()); -> rejected!

if (typeof value === "string") {
  console.log(value.toUpperCase()); // "HELLO"
}
‎unknown‎ يتطلّب تحققًا قبل الاستخدام.

اختبار المعرفة

تأكّد من أنك تذكّرت النقاط الأساسية في هذا الدرس.

  1. ما هو استنتاج الأنواع؟
    • يستنتج TypeScript النوع من القيمة الأولية
    • يزيل TypeScript الأنواع من البرنامج
    • يحوّل TypeScript الأرقام إلى نصوص
  2. لماذا ينبغي تجنّب any قدر الإمكان؟
    • يبطّئ البرنامج
    • يعطّل عمليات تحقق TypeScript
    • إنه ممنوع في اللغة
    • يعمل مع الأرقام فقط
  3. ماذا يجب أن تفعل قبل استخدام قيمة من نوع unknown؟
    • التحقق من نوعها، مثلًا بـ typeof
    • تحويلها إلى any
    • التصريح عنها مرة ثانية