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

reactjs - วิธีส่งอินเตอร์เฟซเป็นพร็อพใน React พร้อม TypeScript?


ฉันอยากจะส่งอ็อบเจ็กต์เข้าไปในคอมโพเนนต์แบบฟังก์ชันของฉัน อ็อบเจ็กต์นี้มีรูปแบบที่สม่ำเสมอ ดังนั้นฉันจึงใช้อินเทอร์เฟซ นี่คือบรรทัดพารามิเตอร์ของคอมโพเนนต์แบบฟังก์ชัน:

interface Option { value: any, label: string; } 

export default function JSelect(options: Option[], primaryColor: string, textColor: string) {

และนี่คือตัวอย่างการใช้งานของส่วนประกอบ:

interface Option { value: any, label: string; }
const letteroptions: Option[] = [
    { value: 0, label: 'Ab' },
    { value: 1, label: 'A' },
    { value: 2, label: 'Bb' },
    { value: 3, label: 'B' },
    { value: 4, label: 'C' },
    { value: 5, label: 'Db' },
    { value: 6, label: 'D' },
    { value: 7, label: 'Eb' },
    { value: 8, label: 'E' },
    { value: 9, label: 'F' },
    { value: 10, label: 'Gb' },
    { value: 11, label: 'G' }
];

<JSelect options={letteroptions} primaryColor='#87c6bb' textColor='#2c3f43' />

ประเภทถูกกำหนดไว้อย่างเดียวกันพอดี ดังนั้นฉันจึงไม่แน่ใจว่าทำไมสิ่งนี้ถึงไม่ทำงาน นี่คือข้อผิดพลาดที่ฉันได้รับ:

(คุณสมบัติ) ตัวเลือก: Option[]

ประเภท ''{ options: Option[]; primaryColor: string; textColor: string; }'' ไม่สามารถกำหนดค่าให้กับประเภท ''IntrinsicAttributes & Option[]'' ได้ คุณสมบัติ ''options'' ไม่มีอยู่ในประเภท ''IntrinsicAttributes & Option[]''.ts(2322)

คำตอบ #1

แทนที่จะใช้หลายอาร์กิวเมนต์ คุณสมบัติของคุณควรเป็นฟิลด์ของอาร์กิวเมนต์ตัวแรกของคอมโพเนนต์ของคุณ คุณควรกำหนดคอมโพเนนต์ของคุณดังที่แสดงด้านล่างแทน

interface JSelectProps {
  options: Option[];
  primaryColor: string;
  textColor: string;
}


export default function JSelect({
  options,
  primaryColor,
  textColor,
}: JselectProps) {}

ถ้าคุณต้องการเรียนรู้เพิ่มเติมเกี่ยวกับการพิมพ์คอมโพเนนต์ของ React ลองดู cheatsheet ของ React TypeScript

คำตอบ #2

export default function JSelect(options: Option[], primaryColor: string, textColor: string) {

ถ้า JSelect เป็นคอมโพเนนต์ คอมโพเนนต์จะรับเพียง หนึ่งอาร์กิวเมนต์ ไม่ใช่หลายอาร์กิวเมนต์ อาร์กิวเมนต์นั้นเป็นอ็อบเจกต์ที่มี props แต่ละตัว ดังนั้นประเภทสำหรับสิ่งนี้ควรเป็น:

interface JSelectProps {
  options: Option[],
  primaryColor: string,
  textColor: string
}

export default function JSelect(props: JSelectProps) {
  // ... do stuff with props.options, props.primaryColor, props.textColor
}

ถ้าคุณต้องการ คุณสามารถใช้การแยกโครงสร้างเพื่อแยกวัตถุ props ออกเป็นตัวแปรแต่ละตัวได้:

export default function JSelect({ options, primaryColor, textColor }: JSelectProps) {
  // ... do stuff with options, primaryColor, textColor
}