0Pricing
Frontend Academy · درس

تضييق الأنواع: typeof وinstanceof والاتحادات المميّزة

استخدم حواجز الأنواع لتضييق الأنواع الاتحادية أثناء التشغيل باستخدام typeof وinstanceof وأنماط الاتحادات المميّزة.

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

ما تضييق النوع؟

يبدأ TypeScript بنوع واسع، مثل string | number. وتضييق النوع هو عملية تنقيح النوع إلى نوع أكثر تحديدًا داخل كتلة شرطية. يتتبّع TypeScript هذا التضييق تلقائيًا.

تضييق النوع باستخدام typeof

يضيّق العامل typeof الأنواع البدائية. داخل كتلة if، يعرف TypeScript النوع الدقيق.

function format(value: string | number | boolean): string {
  if (typeof value === 'string') {
    return value.toUpperCase(); // string here
  }
  if (typeof value === 'number') {
    return value.toFixed(2);   // number here
  }
  return String(value);        // boolean here
}

تضييق النوع باستخدام instanceof

يضيّق instanceof أنواع مثيلات الفئات. ويعرف TypeScript الفئة المحددة داخل الكتلة.

function processError(err: unknown) {
  if (err instanceof Error) {
    console.error(err.message); // Error methods available
  } else if (err instanceof Response) {
    console.error('HTTP error:', err.status);
  } else {
    console.error('Unknown:', err);
  }
}

تضييق النوع باستخدام القيم الصادقة

يستبعد TypeScript القيمتين null وundefined عند إجراء فحوصات القيم الصادقة.

function printLength(value: string | null | undefined) {
  if (value) {
    console.log(value.length); // string here (null/undefined filtered)
  }
}

تضييق النوع بالمساواة

يضيّق اختبار المساواة الصارمة النوع إلى النوع الحرفي. وهذا مفيد لاتحادات الأنواع المميَّزة وتعدادات السلاسل النصية.

function handle(action: 'submit' | 'cancel' | 'reset') {
  if (action === 'submit') {
    // action is exactly 'submit'
    doSubmit();
  }
}

تضييق النوع باستخدام العامل in

يضيّق العامل in أنواع اتحادات الكائنات من خلال التحقق من الخصائص الموجودة.

interface Cat { meow(): void; }
interface Dog { bark(): void; }

function speak(animal: Cat | Dog) {
  if ('meow' in animal) {
    animal.meow(); // Cat
  } else {
    animal.bark(); // Dog
  }
}

اتحادات الأنواع المميَّزة — التضييق القائم على الوسم

يحتوي اتحاد الأنواع المميَّزة على خاصية مشتركة من نوع حرفي، تُسمّى المميِّز. يضيّق TypeScript الاتحاد في switch/if بالاعتماد على تلك الخاصية.

type LoadingState = { status: 'loading' };
type SuccessState = { status: 'success'; data: User[] };
type ErrorState   = { status: 'error'; message: string };
type State = LoadingState | SuccessState | ErrorState;

function render(state: State) {
  switch (state.status) {
    case 'loading': return '<Spinner />';
    case 'success': return renderUsers(state.data);  // state.data available
    case 'error':   return renderError(state.message);
  }
}

مسندات الأنواع — حواجز الأنواع المخصّصة

تضيّق دالة مسند النوع النوعَ لدى المستدعي. استخدم param is Type بوصفه نوع القيمة المُعادة.

function isUser(value: unknown): value is User {
  return (
    typeof value === 'object' &&
    value !== null &&
    'name' in value &&
    typeof (value as User).name === 'string'
  );
}

const data: unknown = await fetchJson('/api/me');
if (isUser(data)) {
  console.log(data.name); // typed as User
}

دوال التأكيد

تطرح دالة التأكيد استثناءً إذا فشل الشرط، ثم تضيّق النوع بعد استدعائها.

function assertIsString(val: unknown): asserts val is string {
  if (typeof val !== 'string') throw new Error('Expected string');
}

const val: unknown = getInput();
assertIsString(val);
console.log(val.toUpperCase()); // val is string here

التحقق من شمول الحالات

عندما يترك switch على اتحاد أنواع مميَّزة نوع never في الفرع الافتراضي، يضمن TypeScript معالجة جميع الحالات. أضف فرعًا افتراضيًا يُسنِد القيمة إلى never للحصول على خطأ في الترجمة البرمجية إذا أُضيف نوع بديل جديد.

function render(state: State): string {
  switch (state.status) {
    case 'loading': return '...';
    case 'success': return state.data.length.toString();
    case 'error':   return state.message;
    default:
      const _exhaustive: never = state;
      throw new Error('Unhandled state: ' + _exhaustive);
  }
}

تضييق النوع باستخدام Array.isArray

تضيّق Array.isArray() قيمةً إلى نوع المصفوفة.

function processInput(input: string | string[]) {
  if (Array.isArray(input)) {
    return input.join(', '); // string[]
  }
  return input.toUpperCase(); // string
}

اختبار سريع

ما أسلوب تضييق النوع الذي يستخدم خاصية حرفية مشتركة للتمييز بين الأنواع البديلة في اتحاد الأنواع؟

مراجعة: تضييق الأنواع في TypeScript

يُستخدم typeof للأنواع البدائية. ويُستخدم instanceof للفئات. ويُستخدم العامل in لأشكال الكائنات. وتستبعد فحوصات القيم الصادقة null وundefined. تتيح اتحادات الأنواع المميَّزة، التي تحتوي على خاصية حرفية مشتركة، كتابة عبارات switch شاملة. استخدم مسندات الأنواع المخصّصة (is) لإجراء فحوصات معقدة أثناء التشغيل. ويُستخدم never في الفروع الافتراضية للتحقق من شمول الحالات.

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

هل درس «تضييق الأنواع: typeof وinstanceof والاتحادات المميّزة» مجاني؟

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

ماذا ستتعلم في «تضييق الأنواع: typeof وinstanceof والاتحادات المميّزة»؟

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

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

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

كم من الوقت يستغرق درس «تضييق الأنواع: typeof وinstanceof والاتحادات المميّزة»؟

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

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

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

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

  1. الأنواع العامة: T وextends والقيود
  2. أنواع الأدوات: Partial وRequired وPick وOmit
  3. الأنواع المعتمدة على التعيين والأنواع الشرطية
  4. تضييق الأنواع: typeof وinstanceof والاتحادات المميّزة
← العودة إلى Frontend Academy