ฉันสร้าง<If />
ส่วนประกอบฟังก์ชันอย่างง่ายโดยใช้ React:
import React, { ReactElement } from "react";
interface Props {
condition: boolean;
comment?: any;
}
export function If(props: React.PropsWithChildren<Props>): ReactElement | null {
if (props.condition) {
return <>{props.children}</>;
}
return null;
}
มันช่วยให้ฉันเขียนรหัสทำความสะอาดเช่น:
render() {
...
<If condition={truthy}>
presnet if truthy
</If>
...
ในกรณีส่วนใหญ่มันใช้งานได้ดี แต่เมื่อฉันต้องการตรวจสอบว่าตัวแปรที่กำหนดไม่ได้ถูกกำหนดและผ่านมันเป็นคุณสมบัติมันจะกลายเป็นปัญหา ฉันจะให้ตัวอย่าง:
สมมติว่าฉันมีองค์ประกอบที่เรียกว่า<Animal />
ซึ่งมีอุปกรณ์ประกอบฉากต่อไปนี้:
interface AnimalProps {
animal: Animal;
}
และตอนนี้ฉันมีองค์ประกอบอื่นที่แสดงผล DOM ต่อไปนี้:
const animal: Animal | undefined = ...;
return (
<If condition={animal !== undefined} comment="if animal is defined, then present it">
<Animal animal={animal} /> // <-- Error! expected Animal, but got Animal | undefined
</If>
);
ตามที่ฉันแสดงความคิดเห็นแม้ว่าในความเป็นจริงแล้วสัตว์ไม่ได้ถูกกำหนด แต่ฉันก็ไม่มีทางที่จะบอก typescript ว่าฉันได้ตรวจสอบแล้ว การยืนยันanimal!
จะได้ผล แต่นั่นไม่ใช่สิ่งที่ฉันกำลังมองหา
ความคิดใด ๆ
<Animal animal={animal as Animal} />
{animal !== undefined && <Anibal animal={animal} />}
จะใช้ได้