ค้นหาเว็บไซต์

javascript - React + TypeScript: การส่ง React Component เป็น Props, การเรนเดอร์ด้วย props [ข้อผิดพลาด: TS2339]


ฉันกำลังใช้ React + TypeScript ฉันมีสถานการณ์ที่ฉันต้องส่งคอมโพเนนต์ React.SFC ไปยังคอมโพเนนต์อื่น ซึ่งฉันกำลังทำแบบนี้:

Container.tsx

import ChildComp from './ChildComp';
<ParentComponent CustomComp={ ChildComp } someArray={ [1, 2] } />

ตอนนี้ปัญหาคือ ผมต้องการวนซ้ำคอมโพเนนต์ ChildComp นี้กับค่าของ someArray ภายใน ParentComponent

Component ย่อยนี้มี prop ของตัวเองคือ someValue และฉันได้เพิ่มประเภทให้กับมัน ว่าสามารถรับค่าอะไรได้บ้าง และฉันกำลังส่ง prop ตัวนี้ขณะวนซ้ำมันอยู่ภายใน Parent

ParentComponent.tsx

const content = someArray.map((value, index) => (
  <CustomComp someValue={ value } key={ index } />
));
{ content }

แต่ฉันได้รับข้อผิดพลาดว่า TS2339: ไม่มีคุณสมบัติ 'someValue' ในประเภท 'IntrinsicAttributes & { children?: ReactNode; }'.

แม้ว่า ถ้าฉันใช้การวนซ้ำข้างต้นโดยตรงใน Container.tsx ที่ฉันกำลังนำเข้า มันทำงานได้ดี แต่จะไม่ทำงานถ้าฉันส่งมันไปยังคอมโพเนนต์อื่น ฉันพลาดอะไรไปหรือเปล่า?

หมายเหตุ: เนื่องจากการวนซ้ำเดียวกันกำลังทำงานบน Container.tsx ฉันจึงส่งเนื้อหาที่ถูกวนซ้ำไปยัง ParentComponent และทำการเรนเดอร์มันเหมือนกับตัวแปร:

{ CustomComp }

นี่ใช้ได้ แต่ฉันอยากรู้ว่าทำไมวิธีแก้อีกวิธีจึงใช้ไม่ได้

รายละเอียดเพิ่มเติม

ChildComp.tsx

type Props = {
   someValue: number,
};

const ChildComp: React.SFC<Props> = ({ someValue }) => {
   return (
      // Content
      { someValue }
   )
}

ประเภทของ CustomComp ใน ParentComponent:

type Props = {
   CustomComp?: React.ReactNode | null
};

ก่อนหน้านี้มันเป็น React.ComponentType แต่ฉันได้รับข้อผิดพลาด ดังนั้นฉันจึงเปลี่ยนเป็น ReactNode เพราะตอนนี้ฉันกำลังส่งเนื้อหาโดยตรง

คำตอบ #1

พร็อพ CustomComp ไม่ได้พิมพ์อย่างถูกต้อง มันรับคอมโพเนนต์ (CustomComp={ ChildComp }) ไม่ใช่เอลิเมนต์ (CustomComp={ <ChildComp /> }) ในกรณีนี้มันจะไม่ใช่ React.ReactNode แต่จะเป็น React.ComponentType.

มันก็ไม่ใช่คอมโพเนนต์สุ่ม แต่เป็นคอมโพเนนต์เฉพาะที่รับ prop someValue props ของ ParentComponent น่าจะต้องถูกพิมพ์เป็น:

type ParentCompProps = {
   CustomComp: React.ComponentType<ChildCompProps>,
   someArray: number[]
};