0Pricing
TypeScript Academy · درس

الاستدعاءات الاختيارية والوصول إلى العناصر

استخدموا ?.() و?.[] لاستدعاء الدوال والوصول إلى الفهارس بأمان

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

ما بعد الوصول إلى الخاصية

لا يقتصر التسلسل الاختياري على obj?.prop. فله شكلان إضافيان: الاستدعاءات الاختيارية باستخدام ?.() والوصول الاختياري إلى العناصر باستخدام ?.[index]. وكلاهما يوقف التنفيذ مبكرًا عند القيم العدمية، تمامًا مثل الوصول إلى الخاصية.

type Obj = { greet?: () => string };
const o: Obj = {};
console.log(o.greet?.()); // undefined, no crash

استدعاءات الأساليب الاختيارية

استخدم obj.method?.() لاستدعاء أسلوب ما فقط إذا كان موجودًا. إذا كانت قيمة method هي null أو undefined، فسيُتخطى الاستدعاء وتكون قيمة التعبير undefined.

type Logger = { log?: (m: string) => void };
const silent: Logger = {};
silent.log?.('hello'); // skipped, no error
console.log('continued safely');

أين تضع ?.؟

تأتي ?. مباشرةً قبل أقواس الاستدعاء. تتحقق obj.method?.() من method، وليس من obj. ولحماية obj أيضًا، اكتب obj?.method?.().

type Api = { send?: (x: number) => number };
const api: Api | null = null;
console.log(api?.send?.(5)); // undefined; guards both api and send

استدعاء دوال الاستدعاء الراجعة الاختيارية

من الاستخدامات الشائعة استدعاء معامل callback اختياري. وبدلًا من إجراء فحص باستخدام if، اكتب callback?.() لاستدعائه فقط عند توفيره.

function run(onDone?: () => void): void {
  console.log('working...');
  onDone?.(); // call only if passed
}
run();
run(() => console.log('finished'));

الوصول الاختياري إلى العناصر

بالنسبة إلى المصفوفات أو تواقيع الفهرسة التي قد تكون عدمية، استخدم arr?.[index]. إذا كانت قيمة arr عدمية، يتوقف الوصول مبكرًا؛ وإلا فستتم قراءة العنصر بشكل طبيعي.

const list: string[] | undefined = undefined;
console.log(list?.[0]); // undefined, no crash

الوصول إلى العناصر باستخدام مفاتيح ديناميكية

يعمل الوصول الاختياري إلى العناصر أيضًا مع صيغة الأقواس للوصول إلى مفاتيح ديناميكية أو محسوبة في كائن قد تكون قيمته عدمية.

type Dict = { [key: string]: number };
const data: Dict | null = { a: 1, b: 2 };
const key = 'a';
console.log(data?.[key]); // 1

دمج الوصول إلى العناصر والاستدعاءات

يمكنك مزج الصيغ بحرية. ادخل إلى مصفوفة اختيارية، ثم استدعِ أسلوبًا اختياريًا على العنصر — إذ تحمي كل ?. خطوةً خاصة بها.

type Handlers = Array<{ fire?: () => string }>;
const hs: Handlers | undefined = [{ fire: () => 'boom' }];
console.log(hs?.[0]?.fire?.());

التسلسل الاختياري مع نتائج الدوال

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

function getHandler(): (() => string) | undefined {
  return undefined;
}
console.log(getHandler()?.()); // undefined

يتضمن نوع النتيجة undefined

كما هو الحال مع سلاسل الوصول إلى الخصائص، يضيف الاستدعاء الاختياري والوصول إلى العناصر undefined إلى نوع النتيجة. اقرنهما مع ?? لتوفير قيمة افتراضية وإزالة undefined.

type Obj = { compute?: () => number };
const o: Obj = {};
const value = o.compute?.() ?? 0;
console.log(value);

حماية معالجات الأحداث

في شيفرة واجهة المستخدم والأحداث، تتيح الاستدعاءات الاختيارية استدعاء المعالجات التي قد لا تكون مضبوطة بطريقة أنيقة. فلا حاجة إلى فحص مطول لوجودها، ولا يحدث تعطل عند غياب المعالج.

type Props = { onClick?: (id: number) => void };
function click(p: Props, id: number): void {
  p.onClick?.(id); // safe if onClick is missing
}
click({ onClick: (id) => console.log('clicked', id) }, 7);
click({}, 8);

مثال على موزّع الإضافات

لنجمع المفاهيم معًا: موزّع يستدعي اختياريًا hook مسمى لإضافة من سجل قد تكون بعض عناصره مفقودة، ويستخدم نتيجة افتراضية عندما لا يعالج أي شيء الطلب.

type Hooks = { [name: string]: (() => string) | undefined };
const hooks: Hooks = { save: () => 'saved' };
function fire(name: string): string {
  return hooks[name]?.() ?? 'no handler';
}
console.log(fire('save'), fire('delete'));

اختبار سريع

اختبر مدى فهمك للاستدعاءات الاختيارية والوصول إلى العناصر.

مراجعة: الاستدعاءات والوصول الاختياريان

لقد تعلمت الصيغ الأخرى للتسلسل الاختياري:

  • تستدعي obj.method?.() أسلوبًا فقط إذا كان موجودًا.
  • تقرأ arr?.[index] عنصرًا بأمان من حاوية قد تكون عدمية.
  • تتوقف جميع الصيغ مبكرًا وتعيد undefined عند وجود معامل عدمي.
  • يمكنك دمجها مع ?? لتوفير قيمة افتراضية للنتيجة.

المقرر التالي: أساسيات readonly وعدم القابلية للتغيير.

type Cfg = { init?: () => void };
const c: Cfg = {};
c.init?.();
console.log('ran safely');

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

هل درس «الاستدعاءات الاختيارية والوصول إلى العناصر» مجاني؟

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

ماذا ستتعلم في «الاستدعاءات الاختيارية والوصول إلى العناصر»؟

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

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

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

كم من الوقت يستغرق درس «الاستدعاءات الاختيارية والوصول إلى العناصر»؟

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

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

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

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

  1. السلسلة الاختيارية باستخدام ?.
  2. الدمج مع nullish باستخدام ??
  3. دمج ?. و??
  4. الاستدعاءات الاختيارية والوصول إلى العناصر
← العودة إلى TypeScript Academy