0Pricing
TypeScript Academy · درس

تحديد أنواع الدوال متغيرة الوسائط

ابنوا واجهات برمجة مرنة باستخدام أنواع الصفائف متغيرة الوسائط

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

الدوال العامة متغيرة الوسائط

تتيح أنواع tuple متغيرة الوسائط للأنواع العامة التقاط قوائم الوسائط ومعالجتها. ويفتح ذلك المجال أمام أدوات لضم Tuples، وتمرير المعلمات، وإعادة تشكيل تواقيع الاستدعاء مع أمان نوعي كامل.

التقاط الوسائط في tuple

يمكن لنوع عام مقيّد بـ unknown[] أن يلتقط قائمة الوسائط بأكملها في صورة نوع tuple هو T، مع الحفاظ على نوع كل معلمة وموضعها.

function tuple<T extends unknown[]>(...args: T): T {
  return args
}
const t = tuple("a", 1, true) // type [string, number, boolean]
console.log(t)

استخدام Spread مع tuple عامة

يمكنك استخدام Spread مع tuple عامة ملتقطة داخل قائمة معلمات أخرى. يمرّر ذلك الوسائط مع الحفاظ على أنواعها الدقيقة.

function wrap<T extends unknown[]>(fn: (...args: T) => void) {
  return (...args: T) => fn(...args)
}
const log = wrap((n: number, s: string) => console.log(n, s))
log(1, "hi")

ضم Tuples اثنتين

تتألق أنواع tuple متغيرة الوسائط عند دمج Tuples. يؤدي استخدام Spread مع Tuples عامة اثنتين في نوع الإرجاع إلى إنتاج تسلسلهما المضموم.

function concat<A extends unknown[], B extends unknown[]>(a: A, b: B): [...A, ...B] {
  return [...a, ...b]
}
const r = concat([1, 2], ["a"]) // [number, number, string]
console.log(r)

سبب دقة نوع النتيجة

لأن [...A, ...B] يستخدم Spread مع Tuples العامة، تحافظ النتيجة على نوع كل عنصر وترتيبه، بدلًا من إنتاج مصفوفة اتحاد موسّعة فحسب.

function concat<A extends unknown[], B extends unknown[]>(a: A, b: B): [...A, ...B] {
  return [...a, ...b]
}
const r = concat([true], [42])
const flag: boolean = r[0]
const num: number = r[1]
console.log(flag, num)

إضافة وسيط في البداية

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

function withId<T extends unknown[]>(fn: (...args: T) => void) {
  return (id: number, ...rest: T) => {
    console.log("id", id)
    fn(...rest)
  }
}
const f = withId((msg: string) => console.log(msg))
f(7, "hello")

استخراج نوع الرأس

باستخدام معلمة من نوع tuple، يمكنك فصل نوع العنصر الأول عن بقية العناصر باستخدام tuple ذات تسميات، ثم معالجة كل جزء على حدة.

function head<H, T extends unknown[]>(...args: [H, ...T]): H {
  return args[0]
}
const h = head("first", 2, 3) // type string
console.log(h)

نوع الأداة Parameters

تستخرج الأداة المضمّنة Parameters<F> قائمة وسائط الدالة في صورة tuple، وهي نفسها مبنية على أنواع tuple متغيرة الوسائط. يمكنك إعادة استخدام معلمات توقيع في مواضع أخرى.

function greet(name: string, age: number) {}
type GreetArgs = Parameters<typeof greet> // [string, number]
const args: GreetArgs = ["Ada", 36]
console.log(args)

تمرير المعلمات باستخدام Parameters

اجمع بين Parameters وSpread الخاص بـ rest لإنشاء غلاف يمرّر الوسائط إلى دالة موجودة مع الحفاظ على النوع نفسه تمامًا.

function add(a: number, b: number) { return a + b }
function traced(...args: Parameters<typeof add>): number {
  console.log("calling add", args)
  return add(...args)
}
console.log(traced(2, 3))

بناء توقيع شبيه بـ Curry

تتيح Tuples متغيرة الوسائط أدوات التطبيق الجزئي: تلتقط بعض الوسائط الآن، وتتوقع البقية لاحقًا، مع التحقق من الأنواع في جميع المراحل.

function partial<A extends unknown[], B extends unknown[], R>(
  fn: (...args: [...A, ...B]) => R,
  ...a: A
) {
  return (...b: B) => fn(...a, ...b)
}
const addThree = (x: number, y: number, z: number) => x + y + z
const add5 = partial(addThree, 5)
console.log(add5(2, 3)) // 10

القوة والحذر

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

function pipe2<A extends unknown[], B, C>(
  f: (...a: A) => B,
  g: (b: B) => C
) {
  return (...a: A) => g(f(...a))
}
const fn = pipe2((n: number) => n * 2, (n) => n + 1)
console.log(fn(5)) // 11

اختبار سريع

اختبر مدى فهمك للأنواع العامة لـ Tuples متغيرة الوسائط.

مراجعة

تتيح أنواع tuple متغيرة الوسائط للأنواع العامة التقاط قوائم الوسائط في صورة Tuples، ثم استخدامها باستخدام Spread في مواضع المعلمات أو الإرجاع. ويدعم ذلك ضم Tuples ([...A, ...B])، وتمرير الوسائط، وفصل الرأس عن الذيل، والتطبيق الجزئي، مع الحفاظ على أنواع العناصر الدقيقة. وتعتمد الأدوات المضمّنة مثل Parameters<F> على الآلية نفسها. استخدم هذه الأدوات عندما تستحق الكتابة الدقيقة لشكل الدالة التعقيد الإضافي.

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

هل درس «تحديد أنواع الدوال متغيرة الوسائط» مجاني؟

نعم — نص درس «تحديد أنواع الدوال متغيرة الوسائط» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 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. النشر في المصفوفات والكائنات
  3. العناصر المتبقية في الصفائف
  4. تحديد أنواع الدوال متغيرة الوسائط
← العودة إلى TypeScript Academy