0Pricing
React Academy · درس

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

اكتب مكوّنات عامة قابلة لإعادة الاستخدام واستخدم PropsWithChildren وComponentProps وOmit.

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

لماذا المكوّنات العامة؟

تتكيف المكوّنات العامة مع أنواع مختلفة من البيانات مع الحفاظ على أمان الأنواع بالكامل؛ فالقائمة أو القائمة المنسدلة أو الجدول المحدّد الأنواع يمكنه العمل مع أي شكل من أشكال البيانات.

قائمة عامة بسيطة

استخدم معلمة النوع T في الدالة لإنشاء مكوّن قائمة يعرض عناصر من أي نوع.

interface ListProps<T> {
  items: T[];
  renderItem: (item: T, index: number) => React.ReactNode;
  keyExtractor: (item: T) => string;
}

function List<T>({ items, renderItem, keyExtractor }: ListProps<T>) {
  return (
    <ul>
      {items.map((item, i) => (
        <li key={keyExtractor(item)}>{renderItem(item, i)}</li>
      ))}
    </ul>
  );
}

تقييد الأنواع العامة

استخدم extends لإضافة قيود، حتى يعرف TypeScript الخصائص التي يجب أن يتضمنها النوع.

interface SelectProps<T extends { id: string; label: string }> {
  options: T[];
  value: T | null;
  onChange: (option: T) => void;
}

function Select<T extends { id: string; label: string }>(
  { options, value, onChange }: SelectProps<T>
) {
  return (
    <select value={value?.id} onChange={e => onChange(options.find(o => o.id === e.target.value)!)}>
      {options.map(o => <option key={o.id} value={o.id}>{o.label}</option>)}
    </select>
  );
}

PropsWithChildren

يضيف React.PropsWithChildren<P> الخاصية children?: React.ReactNode إلى أي نوع للخصائص، وهو مفيد لمكوّنات التغليف.

function Card({ title, children }: React.PropsWithChildren<{ title: string }>) {
  return (
    <div className="card">
      <h2>{title}</h2>
      {children}
    </div>
  );
}

ComponentProps

يستخرج React.ComponentProps<typeof Component> خصائص مكوّن موجود، وهو مفيد عندما تريد توسيعه أو تغليفه.

import { Button } from './Button';

type ExtendedButtonProps = React.ComponentProps<typeof Button> & {
  loading?: boolean;
};

function LoadingButton({ loading, children, ...props }: ExtendedButtonProps) {
  return (
    <Button {...props} disabled={loading || props.disabled}>
      {loading ? <Spinner /> : children}
    </Button>
  );
}

ComponentPropsWithoutRef

يستخرج React.ComponentPropsWithoutRef<'input'> خصائص عناصر HTML دون خاصية ref، وهو مثالي لتغليف عناصر HTML.

type InputProps = React.ComponentPropsWithoutRef<'input'> & {
  label: string;
  error?: string;
};

function FormInput({ label, error, ...inputProps }: InputProps) {
  return (
    <div>
      <label>{label}</label>
      <input {...inputProps} />
      {error && <span className="error">{error}</span>}
    </div>
  );
}

Omit وPick

استخدم Omit<T, Keys> لإزالة خصائص محدّدة، وPick<T, Keys> للإبقاء على خصائص محدّدة فقط من نوع موجود.

interface UserCardProps {
  id: string;
  name: string;
  email: string;
  avatar: string;
  role: string;
}

// Only expose non-sensitive fields:
type PublicUserCardProps = Omit<UserCardProps, 'email' | 'role'>;
// Or pick exactly what you need:
type AvatarProps = Pick<UserCardProps, 'name' | 'avatar'>;

Partial وRequired

يجعل Partial<T> جميع الخصائص اختيارية، وهو مفيد لنماذج التحديث. ويجعل Required<T> جميع الخصائص مطلوبة.

interface UserFormData { name: string; email: string; bio: string; }

// For update: only send changed fields
type UserUpdatePayload = Partial<UserFormData>;

// For create: all fields are mandatory
type UserCreatePayload = Required<UserFormData>;

Record للقواميس محدّدة الأنواع

ينشئ Record<Keys, Value> نوع كائن ذي أنواع محدّدة للمفاتيح، وهو مفيد لخرائط البحث والترجمات.

type Status = 'idle' | 'loading' | 'success' | 'error';

const statusLabels: Record<Status, string> = {
  idle: 'Ready',
  loading: 'Loading...',
  success: 'Done!',
  error: 'Something went wrong',
};

ReturnType لأنواع hooks

استخدم ReturnType<typeof useMyHook> لاستنتاج النوع المرجع من hook مخصّص دون تكرار النوع يدويًا.

function useCounter(initial: number) {
  const [count, setCount] = useState(initial);
  return { count, increment: () => setCount(c => c + 1) };
}

type CounterHook = ReturnType<typeof useCounter>;
// { count: number; increment: () => void }

مكوّن جدول عام

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

interface Column<T> {
  key: keyof T;
  header: string;
  render?: (value: T[keyof T], row: T) => React.ReactNode;
}

function DataTable<T extends object>({ data, columns }: { data: T[]; columns: Column<T>[] }) {
  return (
    <table>
      <thead><tr>{columns.map(c => <th key={String(c.key)}>{c.header}</th>)}</tr></thead>
      <tbody>{data.map((row, i) => (
        <tr key={i}>{columns.map(c => <td key={String(c.key)}>{c.render ? c.render(row[c.key], row) : String(row[c.key])}</td>)}</tr>
      ))}</tbody>
    </table>
  );
}

تحقق سريع

ما نوع الأدوات الذي يزيل مفاتيح محدّدة من واجهة TypeScript موجودة؟

مراجعة

تستخدم المكوّنات العامة معلمات الأنواع للحفاظ على أمان الأنواع مع اختلاف أشكال البيانات. وتلغي أنواع الأدوات مثل Omit وPick وPartial وComponentProps وPropsWithChildren الحاجة إلى تكرار الأنواع يدويًا، وتجعل واجهات المكوّنات أكثر قابلية للتركيب.

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

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

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

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

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

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

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

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

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

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

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

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

  1. تحديد أنواع الخصائص والقيم المرجعة للمكوّنات
  2. تحديد أنواع الأحداث والمراجع في TypeScript
  3. المكوّنات العامة وأنواع الأدوات
  4. تحديد أنواع Context وCustom Hooks
← العودة إلى React Academy