reactjs - ما الفرق بين React.HTMLProps<> و React.HTMLAttributes؟


أحاول تحديد واجهة الخصائص لمكوني وأود أن تشمل كل السمات الشائعة.

لكني اكتشفت أن هناك واجهتين مختلفتين يمكنني توسيعهما

واجهة MyProps تمتد من React.HTMLProps<HTMLElement> و واجهة MyProps تمتد من React.HTMLAttributes<HTMLElement>

ما الفرق؟ أي واحد يجب أن أستخدم؟ يبدو أن HTMLProps يشمل HTMLAttributes، هل هذا يعني أن HTMLProps يجب أن يكون الخيار الأفضل؟

الإجابة رقم 1

HTMLProps يحتوي على أشياء أكثر من HTMLAttributes. أشياء مثل ref وما إلى ذلك.

مع ذلك، يُوصى بالنمط التالي (ليكون مطابقًا 1-1 مع أي مكوّن أصلي معيّن 🌹):

interface PrimativeProps extends React.ComponentProps<"div">

الإجابة رقم 2

الآن يجب أن تستخدم ComponentPropsWithoutRef أو ComponentPropsWithRef:

export interface PrimitiveProps extends React.ComponentPropsWithoutRef<'div'> { };

React.HTMLProps أو React.HTMLAttributes فعليًا يستنتجان أنواعًا خاطئة لبعض السمات أو لا يحتويان على جميع القيم الممكنة.

مثال خاطئ مع HTMLProps:

export interface ButtonProps extends React.HTMLProps<HTMLButtonElement> {}
export function Button(props: ButtonProps) {
  // ERROR: Type 'string | undefined' is not assignable to type '"button" | "reset" | "submit" | undefined'.
  return <button {...props} />;
}

مثال خاطئ مع HTMLAttributes:

export interface ButtonProps extends React.HTMLAttributes<HTMLButtonElement> {}
export function Button(props: ButtonProps) {
  return <button {...props} />;
}

// Error: Property 'type' does not exist on type 'IntrinsicAttributes & ButtonProps'.
<Button type="button">Test</Button>

لمزيد من المعلومات يمكنك قراءة الملخص، القسم "لماذا ليس ComponentProps أو IntrinsicElements أو [Element]HTMLAttributes أو HTMLProps أو HTMLAttributes؟"