TypeScript Academy · درس

نوع void في الدوال

تعرّفوا إلى اختلاف void عن undefined في مواضع إرجاع الدوال

الدرس 3 من 413 خطوة

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

نوع الإرجاع void

يصف void دالةً لا تُرجع قيمة مفيدة. تكتمل الدالة رغم ذلك؛ لكنها لا تنتج قيمة ينبغي لكم استخدامها. وهذا هو نوع الدوال التي تُستدعى لتنفيذ آثارها الجانبية.

function log(message: string): void {
  console.log(message);
}
log('Hello void');

استنتاج void

إذا لم تتضمن الدالة عبارة return (أو تضمنت فقط return; مجردة)، فإن TypeScript يستنتج void تلقائيًا. ونادرًا ما تحتاجون إلى كتابته صراحةً، مع أنه يوثّق القصد.

function greet(name: string) {
  console.log('Hi ' + name);
  // no return -> inferred void
}
greet('Ada');

void في مقابل undefined

المصطلحان مرتبطان، لكنهما ليسا متماثلين. قد تُرجع دالة من نوع void القيمة undefined فعلًا أو لا تُرجعها، ولا يُفترض أن تعتمدوا على قيمة إرجاعها. أما الدالة المحدد نوع إرجاعها بـ undefined فيجب أن تُرجع هذه القيمة صراحةً.

function a(): void { /* returns nothing useful */ }
function b(): undefined { return undefined; }
console.log(a(), b());

لا ينبغي استخدام نتيجة void

القيمة الفعلية الناتجة عن استدعاء void هي undefined، لكن نظام الأنواع يثني عن استخدامها. تعاملوا مع void على أنه يعني «تجاهل قيمة الإرجاع هذه».

function save(): void {
  console.log('saved');
}
const result = save(); // result has type void
console.log(result); // undefined at runtime

void في أنواع دوال رد الاتصال

هناك قاعدة دقيقة وقوية: يمكن تلبية نوع دالة رد اتصال محدد لإرجاع void بدالة تُرجع أي قيمة. إذ تُتجاهل قيمة الإرجاع الإضافية ببساطة.

type Handler = () => void;

const h: Handler = () => 42; // returns number, still fine
h();
console.log('Returned value is ignored by callers');

سبب وجود هذه القاعدة

تتيح لكم هذه المرونة تمرير دوال مثل arr.push (التي تُرجع رقمًا) بوصفها دوال رد اتصال من نوع void. فقد تعهّد المستدعي بعدم استخدام قيمة الإرجاع، ولذلك تكون أي قيمة مُرجعة غير ضارة.

const items: number[] = [];
const nums = [1, 2, 3];
nums.forEach((n) => items.push(n)); // push returns number, ok
console.log(items);

void السياقي في أساليب المصفوفات

يتوقع forEach دالة رد اتصال تُرجع void. لذلك يمكنكم كتابة دالة سهمية من سطر واحد تُرجع قيمةً عرضًا من دون ظهور خطأ؛ إذ يمتص نوع void السياقي هذه القيمة.

const result: string[] = [];
['a', 'b'].forEach((x) => result.push(x.toUpperCase()));
console.log(result);

التباس شائع

تنطبق قاعدة دالة رد الاتصال من نوع void على نوع دالة رد الاتصال، وليس على الدوال التي يكون نوع إرجاعها المصرّح به ذاتيًا هو void. فالدالة المعلنة حرفيًا بالشكل (): void لا يمكنها أن تحتوي على return value; بقيمة غير undefined.

function f(): void {
  return; // ok
  // return 5; // Error: 5 not assignable to void
}
f();
console.log('declared void cannot return a value');

معاملات void غير معتادة

رغم ندرة ذلك، يمكن أن يظهر void بوصفه نوعًا لمعامل في الأنساق العامة المتقدمة. أما في الشيفرة اليومية، فسترونه تقريبًا دائمًا نوع إرجاع يشير إلى «عدم وجود نتيجة ذات معنى».

type Listener = (event: string) => void;

const onClick: Listener = (e) => console.log('Event:', e);
onClick('click');

void مع الوعود

غالبًا ما تُرجع الدوال غير المتزامنة Promise<void> عندما تنفّذ عملًا لكنها تكتمل من دون قيمة. ويشبه هذا النمط void المتزامن في الشيفرة غير المتزامنة.

async function sync(): Promise<void> {
  console.log('syncing...');
  // resolves with no value
}
sync().then(() => console.log('done'));

اختيار void عن قصد

صرّحوا باستخدام void عندما تريدون توضيح أن الدالة موجودة لتنفيذ آثارها الجانبية، وأنه يجب ألا يعتمد المستدعون على قيمة إرجاعها. فهذا يوضح القصد ويتيح لكم الاستفادة من قاعدة دوال رد الاتصال المرنة.

function notify(msg: string): void {
  console.log('NOTIFY:', msg);
}
const handlers: Array<(m: string) => void> = [notify];
handlers.forEach((fn) => fn('ping'));

تحقق سريع

اختبروا مدى فهمكم لنوع void.

مراجعة: void

لقد تعلمتم أن void:

  • يحدد الدوال التي تُرجع لا قيمة مفيدة.
  • يختلف عن undefined؛ إذ لا ينبغي استخدام نتائج void.
  • يقبل، عند استخدامه نوعًا لدالة رد اتصال، دوال تُرجع أي قيمة (ويتجاهلها المستدعون).
  • يتيح استخدام أساليب مثل push بسلاسة داخل forEach.

بعد ذلك، سنجمع كل ذلك معًا: التعامل الآمن مع unknown.

const tasks: Array<() => void> = [
  () => console.log('task 1'),
  () => console.log('task 2')
];
tasks.forEach((t) => t());
البدء مجانًا

تعلم TypeScript مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
101
الدروس
352

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

هل درس «نوع void في الدوال» مجاني؟

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

ماذا ستتعلم في «نوع void في الدوال»؟

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

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

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

كم من الوقت يستغرق درس «نوع void في الدوال»؟

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

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

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

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

  1. فهم unknown مقارنةً بـ any
  2. نوع never والحالات المستحيلة
  3. نوع void في الدوال
  4. التعامل الآمن نوعيًا مع unknown
← العودة إلى TypeScript Academy