javascript - ტიპის შეცდომა React კომპონენტში, რომელიც შექმნილია forwardRef-ით
მე ვქმნი ელემენტს (კარდის კომპონენტი) forwardRef-ის გამოყენებით, მაგრამ ტიპები არ ემთხვევა, როცა მას ვიყენებ.
აქ არის ბარათის კომპონენტის კოდი
export const Card = React.forwardRef((
{ fluidHeight, className, ...props }:
{ fluidHeight?:boolean, className?:string, props?:any }, ref?:any) => (
<div
{...props}
ref={ref}
className={clsx(
"card card-custom gutter-b",
{ "card-height-fluid": fluidHeight },
className
)}
/>
));
აქ არის კოდი, რომელიც იყენებს კარტის კომპონენტს
<Card>
<CardHeader title="List">
<CardHeaderToolbar>
<button
type="button"
className="btn btn-primary"
onClick={UIProps.addButtonClick}
>
Add New
</button>
</CardHeaderToolbar>
</CardHeader>
<CardBody>
<DevicesFilter />
{UIProps.ids.length > 0 && <Grouping />}
<DevicesTable />
</CardBody>
</Card>
ზემო.snippet-ში Card კომპონენტის გამოყენებისას, კომპილატორი აჩვენებს ტიპის შეცდომას და მისი ანთება აჩვენებს შემდეგ შეცდომას.
ტიპს '{ children: Element[]; }' არ აქვს საერთო თვისებები ტიპთან 'IntrinsicAttributes & { fluidHeight?: boolean; className?: string; props?: any; } & RefAttributes'
ვიცი, რომ ეს არის forwardRef-ის პრობლემა TypeScript-ში, მაგრამ არ ვიცი როგორ გავასწორო.
რედაქტირება
მე ვიპოვე ასეთი ხრიკი
ბარათის კომპონენტი
export const Card = React.forwardRef((
{ children, fluidHeight, className, ...props }:
{children:JSX.Element[], fluidHeight?:boolean, className?:string, props?:any }, ref?:any) => (
<div
{...props}
ref={ref}
className={clsx(
"card card-custom gutter-b",
{ "card-height-fluid": fluidHeight },
className
)}
>
{/* {children} in case of forwardRef children elements are automatically passed from calling
component and should be used like this */}
</div>
));
მაგრამ ჩემი ვარაუდის მიხედვით, ამ შემთხვევაში როცა მე არ მჭირდება არასდროს ვაწარმოო რომელიმე შვილობილი ელემენტები Card კომპონენტში, მე უნდა გამოვიყენო რამე სხვა forwardRef-ის ნაცვლად, მაგრამ არ ვიცი რა :)
გთხოვთ, დამეხმარეთ! მადლობა
პასუხი #1
ბავშვების ტიპისთვის, თქვენ არ უნდა გამოიყენოთ JSX.Element ან JSX.Element[]. ჩვეულებრივ, კონვენციაა გამოიყენოთ React.ReactNode. ეს ითვალისწინებს ზემოთ აღნიშნულ 2 ტიპს და ყველა სხვა ვალიდურ ტიპს ბავშვებისთვის, როგორიცაა string ან null.
თუმცა, მე ვფიქრობდი Props-ის განსაზღვრების შეცვლას ამ გზით:
type YourProps = { fluidHeight?:boolean, className?:string, props?:any };
type CardProps = React.PropsWithChildren<YourProps>;
export const Card = React.forwardRef((
{ fluidHeight, className, ...props }: CardProps, ref?:any) => (
<div
{...props}
ref={ref}
className={clsx(
"card card-custom gutter-b",
{ "card-height-fluid": fluidHeight },
className
)}
/>
));
სადაც React.PropsWithChildren<T> არის სასარგებლო ტიპი, რომელიც შეიცავს შვილებს როგორც React.ReactNode ტიპს. აქ არის განსაზღვრა
type PropsWithChildren<P> = P & { children?: ReactNode };
