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

reactjs - วิธีทำให้การกำหนดชนิดของ props ของคอมโพเนนต์ React ขึ้นอยู่กับกันและกันและถูกอนุมานโดยอัตโนมัติ


ฉันมีคอมโพเนนต์ React แบบนามธรรม (BaseTable) ที่ดึงข้อมูลจาก API และแสดงผลลัพธ์เป็นแถวในตาราง:

interface BaseTableProps {
  columns: Column<R>[];
  fetchData: () => Promise<AjaxError | R>
}

const BaseTable: FC<BaseTableProps> = ({
  columns,
  fetchData,
}) => { return .... }

แล้วฉันจะนำตารางฐานนี้ไปใช้กับตารางข้อมูลเฉพาะที่ฉันต้องการแสดง

ตัวอย่างเช่น ถ้าฉันต้องการแสดงรายการสิ่งที่ต้องทำ ฉันทำแบบนี้:

// the JSON type that is being returned from the API
interface TodoJSON {
  firstColumn: string;
  secondColumn: string;
}

const fetchTodosAPI: Promise<AjaxError | TodoJSON> = fetchAxios('/todos');

const columns: Column<TodoJSON>[] = [{ key: 'firstColumn' }, { key: 'secondColumn' }];

const TodosTable = () => {
  return (
    <BaseTable fetchData=(fetchTodosAPI) columns={columns} />
  );
};

คำถามคือฉันจะพิมพ์ TypeScript ของ BaseTable อย่างไรเพื่อให้ฉันสามารถให้ generic R เท่ากับข้อมูลที่ฉันโหลดมาจาก API ในกรณีนี้คือ TodoJSON

ถ้าฉันสามารถทำสิ่งนี้ได้ ฉันจะมีคอลัมน์ใน BaseTable ที่เป็นประเภท Column

ด้วยวิธีนี้ fetchData และ columns ทั้งหมดจะเชื่อมโยงกันและฉันมีประเภทที่ปลอดภัยซึ่งถูกควบคุมจากฝั่งการใช้งาน

ถ้าฉันเปลี่ยนประเภทการตอบสนอง JSON ของ fetchData ในตาราง Todo คอลัมน์จะถูกสันนิษฐานโดยอัตโนมัติเป็นประเภท JSON ใหม่