Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs Typescript从React render props中的元组推断类型_Reactjs_Typescript - Fatal编程技术网

Reactjs Typescript从React render props中的元组推断类型

Reactjs Typescript从React render props中的元组推断类型,reactjs,typescript,Reactjs,Typescript,我想从我的fetchData数组推断类型,这样我传递给子对象的参数就可以正确地键入 import * as React from 'react'; interface DataSource { dataSource: () => Promise<unknown>, } interface Data { data: unknown, } interface Props{ fetchData: DataSource[], children: (...data:

我想从我的
fetchData
数组推断类型,这样我传递给
子对象的参数就可以正确地键入

import * as React from 'react';

interface DataSource {
  dataSource: () => Promise<unknown>,
}

interface Data {
  data: unknown,
}

interface Props{
  fetchData: DataSource[],
  children: (...data: any[]) => React.ReactNode;
}

interface State {
  data: Data[];
}
    
const Placeholder : React.FC<Props> = (props) => {
  const [state, setState] = React.useState<State>({
    data: [],
  });

  const getAllData = async () => {
    const result = await Promise.all(props.fetchData.map((item) => item.dataSource()));
    return result as Data[];
  };

  const fetchData = async () => {
      const data = await getAllData();
      setState({
          data,
        });
  };
  React.useEffect(() => {
    fetchData();
  }, []);

  const {
    data
  } = state;

  const { children } = props;

  return (
      {children(...data)}
  );
};
import*as React from'React';
接口数据源{
数据源:()=>承诺,
}
接口数据{
数据:未知,
}
界面道具{
fetchData:DataSource[],
子项:(…数据:any[])=>React.ReactNode;
}
界面状态{
数据:数据[];
}
常量占位符:React.FC=(道具)=>{
常量[状态,设置状态]=React.useState({
数据:[],
});
const getAllData=async()=>{
const result=wait Promise.all(props.fetchData.map((item)=>item.dataSource());
返回结果作为数据[];
};
const fetchData=async()=>{
常量数据=等待getAllData();
设定状态({
数据,
});
};
React.useffect(()=>{
fetchData();
}, []);
常数{
数据
}=国家;
const{children}=props;
返回(
{子(…数据)}
);
};
在以下示例中:

      // const fetchCategories: () => Promise<Category[]>
      // const fetchRoles: () => Promise<Role[]>


      <PlaceHolder fetchData={[{dataSource: fetchCategories }, {dataSource: fetchRoles}]}>
        {(categories /* right now 'categories' type is 'any' but I want to infer type 
         Category[] from 'fetchCategories'  */,
         roles /* same as categories */) => (
          <CreateCategory categories={categories} roles={roles} />
        )}
      </PlaceHolder>
//const fetchCategories:()=>Promise
//const fetchRoles:()=>Promise
{(categories/*现在'categories'类型是'any',但我想推断类型
“fetchCategories”中的类别[]*/,
角色/*与类别相同*/)=>(
)}

可能
子项:([Category[],Roles[])=>React.ReactNode;
。此外,如果我没有弄错的话,
子项应该是
ReactNode
,但您可以将其作为常规函数使用。@MoshFeu那么该组件如何保持通用性?可能
子项:([Category[],Roles[]))=>React.ReactNode;
。此外,如果我没有弄错的话,
子项应该是
ReactNode
,但您可以将其作为常规函数使用。@MoshFeu那么该组件如何保持通用性?