0Pricing
TypeScript Academy · درس

unknown مقابل any: الخيار الأكثر أماناً

تعلّم لماذا يجبرك unknown على التحقق من الأنواع قبل الاستخدام

unknown مقابل any: الخيار الأكثر أماناً درس مجاني في TypeScript Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في TypeScript Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة TypeScript Academy 4 دروس في المجموع.

مرحبًا

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

مشكلة any

مع `any`، توقف TypeScript جميع عمليات التحقق. يمكنك استدعاء الدوال، والوصول إلى الخصائص، وإسناد القيمة إلى متغيرات محددة النوع بلا قيود، ومن دون أمان.
let val: any = getData();
val.someMethod(); // TypeScript: OK. Runtime: possible crash

التعريف بـ unknown

يمثل `unknown` النوع الأعلى الآمن من حيث الأنواع. وكما هو الحال مع `any`، يمكنه احتواء أي قيمة. لكن بخلاف `any`، لا يمكنك استخدامه قبل تضييق نوعه.
let val: unknown = getData();
// val.someMethod(); // Error: Object is of type 'unknown'

تضييق unknown قبل الاستخدام

لاستخدام قيمة من النوع `unknown`، يجب تضييق نوعها باستخدام فحص للنوع. عندها تسمح TypeScript بإجراء العمليات على النوع الذي جرى تضييقه.
let input: unknown = getInput();
if (typeof input === 'string') {
  console.log(input.toUpperCase()); // OK — narrowed to string
}

لا يمكن إسناد unknown إلى أنواع محددة

لا يمكنك إسناد `unknown` إلى نوع محدد من دون فحص أو تأكيد. وهذا يجبرك على التحقق من القيمة قبل استخدامها.
let x: unknown = 'hello';
// let s: string = x; // Error
let s: string = x as string; // OK with assertion

استخدام unknown في كتل catch

في TypeScript 4.0 والإصدارات الأحدث، تكون الأخطاء الملتقطة من النوع `unknown` افتراضيًا. وهذا أكثر أمانًا من الإعداد القديم `any` لأنه يجبرك على التحقق من نوع الخطأ.
try {
  doSomething();
} catch (err: unknown) {
  if (err instanceof Error) {
    console.log(err.message); // safe
  }
}

استخدام unknown للبيانات الخارجية

عند تحليل JSON أو تلقي بيانات من واجهة API، عيّن نوعها أولًا إلى `unknown` ثم تحقّق منها قبل استخدامها.
const raw: unknown = JSON.parse(text);
if (
  typeof raw === 'object' &&
  raw !== null &&
  'name' in raw
) {
  console.log((raw as any).name);
}

حواجز الأنواع مع unknown

تعمل حواجز الأنواع التي يعرّفها المستخدم بكفاءة تامة مع `unknown`، مما يتيح لك التحقق من البنى المعقدة قبل استخدامها.
function isUser(val: unknown): val is { name: string } {
  return typeof val === 'object' && val !== null && 'name' in val;
}

unknown مقابل never

يمثل `unknown` النوع الأعلى، إذ يمكن إسناد كل نوع إليه. أما `never` فيمثل النوع الأدنى، إذ لا يمكن إسناد أي شيء إليه. وهما متضادان.
// unknown: anything can be assigned to it
let a: unknown = 42; // OK

// never: nothing can be assigned to it
function fail(): never { throw new Error(); }

الاختيار بين any وunknown

استخدم `unknown` عندما تتلقى بيانات من نوع غير محدد، مثل JSON أو إدخال المستخدم أو واجهات API الخارجية. ولا تستخدم `any` إلا كحل أخير أثناء الترحيل أو مع المكتبات التي لا توفر أنواعًا.

مكتبات التحقق وقت التشغيل

تتوافق مكتبات مثل Zod وValibot وio-ts تمامًا مع `unknown`. فهي تحلل البيانات وتتحقق منها، ثم تعيد قيمة محددة النوع من إدخال من النوع `unknown`.
import { z } from 'zod';
const UserSchema = z.object({ name: z.string(), age: z.number() });
const user = UserSchema.parse(unknownData); // throws if invalid

تحقق سريع

ما الذي يجب عليك فعله قبل أن تتمكن من استخدام قيمة من النوع `unknown` في TypeScript؟

مراجعة

يمثل `unknown` البديل الآمن من `any`. فهو يقبل أي قيمة، لكنه يجبرك على تضييق النوع قبل الاستخدام. استخدمه للبيانات الخارجية، وكتل catch، وكل حالة يكون فيها النوع مجهولًا فعلًا.

الأسئلة الشائعة

هل درس «unknown مقابل any: الخيار الأكثر أماناً» مجاني؟

نعم — نص درس «unknown مقابل any: الخيار الأكثر أماناً» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة TypeScript Academy، انتقل إلى CoddyKit PRO. تتضمن دورة TypeScript Academy 4 دروس في المجموع.

ماذا ستتعلم في «unknown مقابل any: الخيار الأكثر أماناً»؟

تعلّم لماذا يجبرك unknown على التحقق من الأنواع قبل الاستخدام تتمرن على TypeScript Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ TypeScript Academy؟

لا تُشترط خبرة سابقة. TypeScript Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «unknown مقابل any: الخيار الأكثر أماناً»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس TypeScript Academy هذا؟

نعم. كل درس في TypeScript Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. الأنواع البدائية: string وnumber وboolean
  2. نوع any ولماذا يجب تجنّبه
  3. unknown مقابل any: الخيار الأكثر أماناً
  4. null وundefined والتحقق الصارم من null
← العودة إلى TypeScript Academy