React 的 children as 函数的正确类型是什么?
What is proper type for React's children as function?
我将 children 作为函数传递,将 React.ReactNode
返回到 Provider HOC,如下所示:
<Provider variables={{ id: "qwerty" }}>
{data => (
<ExampleComponent data={data} />
)}
</Provider>
这是提供程序组件示例代码:
type Props = {
id: string;
children: any; // What type should be put here?
};
const Provider: React.SFC<Props> = ({ id, children }) => {
const { data, loading, error } = useQuery<req, reqVariables>(query, {
variables: { id }
});
if (loading) return "Loading...";
if (error) return "Error";
if (!data) return "No data";
return children(data);
}
如果我没有为 children
指定任何类型,因此将其默认为 React.ReactNode
,那么第 return children(data);
行会显示错误:
Cannot invoke an expression whose type lacks a call signature. Type 'string | number | boolean | {} | ReactElement ReactElement Component)> | null) | (new (props: any) => Component)> | ReactNodeArray | ReactPortal' has no compatible call signatures.
如果我在 type Props
中明确指定 children 为 any
,一切正常,但它是 Wrong 来自 Typescript 和类型视角。
什么是 props.children
的正确类型,当传递返回 React.ReactNode
的函数而不是 React.ReactNode
本身时,Typescript 会接受它作为有效的 "Render function" 并允许调用 children
之类的函数?
您可以将子类型指定为 returns 一个 ReactNode
的函数
type Props = {
id: string,
children: (props: InjectedCounterProps) => React.ReactNode
};
JSX.Element
也可以是类型,如果 children 是 'DOM element'。
我将 children 作为函数传递,将 React.ReactNode
返回到 Provider HOC,如下所示:
<Provider variables={{ id: "qwerty" }}>
{data => (
<ExampleComponent data={data} />
)}
</Provider>
这是提供程序组件示例代码:
type Props = {
id: string;
children: any; // What type should be put here?
};
const Provider: React.SFC<Props> = ({ id, children }) => {
const { data, loading, error } = useQuery<req, reqVariables>(query, {
variables: { id }
});
if (loading) return "Loading...";
if (error) return "Error";
if (!data) return "No data";
return children(data);
}
如果我没有为 children
指定任何类型,因此将其默认为 React.ReactNode
,那么第 return children(data);
行会显示错误:
Cannot invoke an expression whose type lacks a call signature. Type 'string | number | boolean | {} | ReactElement ReactElement Component)> | null) | (new (props: any) => Component)> | ReactNodeArray | ReactPortal' has no compatible call signatures.
如果我在 type Props
中明确指定 children 为 any
,一切正常,但它是 Wrong 来自 Typescript 和类型视角。
什么是 props.children
的正确类型,当传递返回 React.ReactNode
的函数而不是 React.ReactNode
本身时,Typescript 会接受它作为有效的 "Render function" 并允许调用 children
之类的函数?
您可以将子类型指定为 returns 一个 ReactNode
的函数type Props = {
id: string,
children: (props: InjectedCounterProps) => React.ReactNode
};
JSX.Element
也可以是类型,如果 children 是 'DOM element'。