0Pricing
TypeScript Academy · درس

الأنواع العامة للمكوّنات — مقدمة

أنشئ مكوّنات قابلة لإعادة الاستخدام باستخدام معاملات الأنواع والقيود والاستنتاج، ومرّر خصائص العرض والمفاتيح ذات الأنواع بأمان.

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

مقدمة

الهدف: اجعل مكوّنًا واحدًا يعمل مع أشكال متعددة من البيانات باستخدام <T>. ستمرّر render prop ذا نوع محدد، وتقيّد المفاتيح، وتدع TypeScript يستنتج T من الاستخدام.

  • خصائص عامة ودوال العرض
  • القيود باستخدام extends
  • استخراج المفاتيح دون any

Generic List<T>

تحافظ List<T> العامة على توافق items وrender. ويمكن للمكوّنات المستهلكة تمرير أي T؛ ويعمل الاستنتاج عندما يكون T واضحًا.

import React from "react"

type ListProps<T> = { items: T[]; render: (item: T, index: number) => React.ReactNode }

export function List<T>({ items, render }: ListProps<T>) {
  return <div style={{ display: "grid", gap: 6 }}>{items.map(render)}</div>
}

export default function App() {
  return (
    <div style={{ display: "grid", gap: 12 }}>
      <List<number> items={[1,2,3]} render={(n) => <span>#{n}</span>} />
      <List<{ id: string; name: string }>
        items={[{ id: "u1", name: "Ada" }, { id: "u2", name: "Lin" }]}
        render={(u) => <strong>{u.name}</strong>}
      />
    </div>
  )
}

القيود باستخدام extends

استخدم T extends Keyed لفرض وجود id للمفاتيح. وستظهر أخطاء لدى المستدعين إذا مرّروا عناصر تفتقر إلى الحقل المطلوب.

import React from "react"

type Keyed = { id: string }

type KeyListProps<T extends Keyed> = { items: T[]; render: (item: T) => React.ReactNode }

export function KeyList<T extends Keyed>({ items, render }: KeyListProps<T>) {
  return (
    <ul>
      {items.map((x) => (
        <li key={x.id}>{render(x)}</li>
      ))}
    </ul>
  )
}

export default function App() {
  const users = [{ id: "u1", name: "Ada" }, { id: "u2", name: "Lin" }]
  return <KeyList items={users} render={(u) => <span>{u.name}</span>} />
}

استنتاج T

تُستنتج معلمات النوع عادةً من الخصائص: إذ يأتي T هنا من items. أضف تحديدًا صريحًا للنوع فقط عندما يكون الاستنتاج غير واضح.

import React from "react"

type GridProps<T> = { items: T[]; columns?: number; render: (item: T) => React.ReactNode }

export function Grid<T>({ items, columns = 2, render }: GridProps<T>) {
  const css = { display: "grid", gridTemplateColumns: `repeat(${columns}, 1fr)`, gap: 8 }
  return <div style={css as React.CSSProperties}>{items.map(render)}</div>
}

export default function App() {
  const products = [
    { sku: "p1", title: "Mouse", price: 25 },
    { sku: "p2", title: "Keyboard", price: 80 }
  ]
  // T is inferred from products; no need to annotate
  return <Grid items={products} render={(p) => <span>{p.title} — ${p.price}</span>} />
}

مساعدات العرض

استخرج أنواع Render<T> القابلة لإعادة الاستخدام لتحسين الوضوح. وقيّدها عند الحاجة (T extends { id: string }) لدعم المفاتيح.

import React from "react"

type Render<T> = (item: T) => React.ReactNode

type TableProps<T extends { id: string }> = { items: T[]; renderRow: Render<T> }

export function Table<T extends { id: string }>({ items, renderRow }: TableProps<T>) {
  return (
    <table>
      <tbody>
        {items.map((x) => (
          <tr key={x.id}><td>{renderRow(x)}</td></tr>
        ))}
      </tbody>
    </table>
  )
}

export default function App() {
  const rows = [ { id: "1", label: "One" }, { id: "2", label: "Two" } ]
  return <Table items={rows} renderRow={(r) => <span>{r.label}</span>} />
}

نصائح ومزالق

نصائح:

  • فضّل الاستنتاج، ولا تضف تحديدًا للنوع إلا عندما يحسّن قابلية القراءة.
  • استخدم extends للتعبير عن المتطلبات.
  • تجنّب any في خصائص العرض العامة؛ إذ يلغي ذلك الأمان.

التحقق من المكوّنات العامة

تحقق سريع: أي تصريح يعرّف مكوّن React عامًا بشكل صحيح؟

مراجعة

مراجعة: استخدم <T> لبناء مكوّنات قابلة لإعادة الاستخدام، وقيّدها باستخدام extends للمفاتيح، ودع الاستنتاج يحافظ على إيجاز الشيفرة.

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

هل درس «الأنواع العامة للمكوّنات — مقدمة» مجاني؟

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

ماذا ستتعلم في «الأنواع العامة للمكوّنات — مقدمة»؟

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

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

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

كم من الوقت يستغرق درس «الأنواع العامة للمكوّنات — مقدمة»؟

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

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

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

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

  1. الخصائص والأبناء؛ معالجات الأحداث؛ المراجع
  2. الحالة والمختزلات؛ كتابة Context
  3. الأنواع العامة للمكوّنات — مقدمة
← العودة إلى TypeScript Academy