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

reactjs - จำกัดลูกที่อนุญาตใน React TypeScript


การใช้ TypeScript ในโปรเจกต์ React มีวิธีใดบ้างที่จะบังคับข้อจำกัดบางอย่างบน children ที่อนุญาตของคอมโพเนนต์? การบังคับในเวลาคอมไพล์เป็นสิ่งที่ต้องการ แต่การบังคับในเวลารันไทม์ก็อาจเป็นประโยชน์เช่นกัน

ในกรณีของผม ผมมีคอมโพเนนต์ หนึ่ง เรียกมันว่า <ClickTracker> และคอมโพเนนต์นี้คาดหวังให้มีลูกเพียงตัวเดียวพร้อมพร็อพแบบ callback คือ onClick และมันจะเพิ่มฟังก์ชันเพิ่มเติมให้กับ callback (ติดตามการคลิกในไลบรารีภายนอก)

นี่ใช้งานได้ดีตราบใดที่เด็กภายใน <ClickTracker> ใช้ประโยชน์จากพร็อพ onClick จริง ๆ (องค์ประกอบ HTML ทุกตัวมีสิ่งนี้ เช่น) แต่จะล้มเหลวโดยไม่มีการแจ้งเตือนในกรณีอื่น

ตัวอย่างเช่น วิธีนี้ใช้ได้:

<ClickTracker>
  <div>Hello</div>
</ClickTracker>

แต่นี่ใช้ไม่ได้:

class Hello extends Component<{}, {}> {
  render() {
    return <div>Hello</div>
  } 
}

<ClickTracker>
  <Hello />
</ClickTracker>

แต่นี่ใช้ได้เพราะมันส่งต่อ onClick ไปยังองค์ประกอบ HTML:

class Hello extends Component<{onClick: MouseEventHandler}, {}> {
  render() {
    return <div onClick={this.props.onClick}>Hello</div>
  } 
}

<ClickTracker>
  <Hello />
</ClickTracker>

อย่างที่คุณเห็น ผมอยากจะมีความปลอดภัยเกี่ยวกับสิ่งที่สามารถใส่เข้าไปใน <ClickTracker> ขึ้นอยู่กับ props ของลูก หรือถ้ามีวิธีอื่นที่สามารถทำได้ก็เช่นกัน

คำตอบ #1

ปัจจุบัน ยังไม่มีวิธีใดที่จะบังคับใช้ชนิดของ children ด้วย TypeScript ได้

มีข้อมูลเพิ่มเติมในประเด็นนี้

คำตอบ #2

หรือถ้ามีวิธีอื่นที่สามารถทำได้

เหตุการณ์คลิกจะฟองขึ้นข้างบน เว้นแต่บางส่วนประกอบจะหยุดการแพร่กระจาย (ซึ่งไม่ใช่พฤติกรรมเริ่มต้นของส่วนประกอบพื้นฐาน) ดังนั้นคุณสามารถ:

<div onClick={()=>alert('still noted')}>
  <Hello />
</div>

และ div นั้นคือ ClickTracker 🌹