0Pricing
TypeScript Academy · درس

التعميم والتطبيق الجزئي

حوّلوا الدوال متعددة الوسائط إلى صيغ معمّمة

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

ما المقصود بـ Currying؟

يحوّل Currying دالةً متعددة الوسائط إلى سلسلة من الدوال أحادية الوسيط. فبدلًا من استدعاء f(a, b)، تستدعي f(a)(b).

المثال الكلاسيكي

تأخذ add هنا عددًا واحدًا وتعيد دالةً تنتظر العدد التالي. ويستنتج TypeScript أنواع الدوال المتداخلة تلقائيًا.

const add = (a: number) => (b: number) => a + b;
console.log(add(2)(3)); // 5

كتابة نوع دالة تستخدم Currying

يوضح النوع الصريح السلسلة بجلاء: دالة تعيد دالة. ويمثل كل سهم وسيطًا واحدًا.

type Add = (a: number) => (b: number) => number;
const add: Add = a => b => a + b;
console.log(add(10)(5)); // 15

التطبيق الجزئي

يثبّت التطبيق الجزئي بعض الوسائط الآن، ويزوّد الدالة بباقي الوسائط لاحقًا. ومع الدالة التي تستخدم Currying، لا يتطلب ذلك سوى استدعائها بعدد أقل من الخطوات.

const add = (a: number) => (b: number) => a + b;
const add10 = add(10); // partially applied
console.log(add10(1), add10(2)); // 11 12

لماذا يفيد التطبيق الجزئي؟

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

تطبيق Currying على ثلاثة وسائط

يمتد هذا النمط إلى أي عدد من الوسائط. يلتقط كل مستوى وسيطًا واحدًا داخل إغلاق، حتى إنتاج القيمة النهائية.

const clamp = (min: number) => (max: number) => (x: number) =>
  Math.min(Math.max(x, min), max);
const toByte = clamp(0)(255);
console.log(toByte(300), toByte(-5)); // 255 0

مفيد لـ map وfilter

تنسجم الدوال التي تستخدم Currying بسهولة مع دوال المصفوفات، لأن map تتوقع دالة ذات وسيط واحد. وينتج التطبيق الجزئي دالةً بهذا الشكل تمامًا.

const mul = (a: number) => (b: number) => a * b;
const triple = mul(3);
console.log([1, 2, 3].map(triple)); // [3, 6, 9]

مساعد عام لتطبيق Currying

يمكنك كتابة مساعد ذي أنواع يطبّق Currying على دالة ذات وسيطين. وتحافظ الأنواع العامة على دقة أنواع الوسائط والإرجاع.

function curry2<A, B, R>(f: (a: A, b: B) => R) {
  return (a: A) => (b: B) => f(a, b);
}
const join = curry2((a: string, b: string) => a + b);
console.log(join("foo")("bar")); // foobar

تلتقط الإغلاقات الوسائط

يعمل Currying لأن كل دالة مُعادة تغلق على الوسائط السابقة. وتظل تلك القيم موجودة حتى يستخدمها الاستدعاء النهائي.

const greet = (greeting: string) => (name: string) =>
  greeting + ", " + name;
const hi = greet("Hi");
console.log(hi("Sam")); // Hi, Sam

متى لا تستخدم Currying؟

قد يضر استخدام Currying مع كل دالة بسهولة القراءة. فاستخدمه عندما يكون التطبيق الجزئي مفيدًا فعلًا، مثل إعداد مساعدين قابلين لإعادة الاستخدام أو تركيب مسارات معالجة.

Currying مقابل الوسائط الافتراضية

توفر الوسائط الافتراضية قيمًا افتراضية، لكنها لا توفر تطبيقًا مرحليًا. أما Currying فيوفر تطبيقًا جزئيًا حقيقيًا، إذ يعيد دالةً فعلية يمكنك تمريرها وإعادة استخدامها.

اختبار سريع

اختبار سريع حول هذا الدرس.

خلاصة

يحوّل Currying التعبير f(a, b) إلى f(a)(b)، أي إلى سلسلة من الدوال ذات الوسيط الواحد، تُكتب أنواعها على شكل أسهم متداخلة. ثم يثبّت التطبيق الجزئي الوسائط الأولى لإنشاء دوال متخصصة قابلة لإعادة الاستخدام، بالاعتماد على الإغلاقات.

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

هل درس «التعميم والتطبيق الجزئي» مجاني؟

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

ماذا ستتعلم في «التعميم والتطبيق الجزئي»؟

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

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

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

كم من الوقت يستغرق درس «التعميم والتطبيق الجزئي»؟

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

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

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

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

  1. الدوال النقية وعدم القابلية للتغيير
  2. التعميم والتطبيق الجزئي
  3. تركيب الدوال مع الأنواع
  4. أدوات pipe وflow محددة الأنواع
← العودة إلى TypeScript Academy