Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/21.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

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.ComponentType推断道具_Reactjs_Typescript_Generics - Fatal编程技术网

Reactjs TypeScript不从React.ComponentType推断道具

Reactjs TypeScript不从React.ComponentType推断道具,reactjs,typescript,generics,Reactjs,Typescript,Generics,我有下面的函数,我想使用它来获取组件类型及其道具,以便允许我将这些道具与路由组件道具一起注入 const routeComponentFactory=( 组件:React.ComponentType, 道具:TProps ) => { 返回(routeProps:RouteComponentProps)=>{ 返回; }; }; 如果我明确指定TProps,此函数将正常工作,例如: 接口MyComponentProps{a:number;b:number;} 常量MyComponent:Rea

我有下面的函数,我想使用它来获取
组件类型及其道具,以便允许我将这些道具与
路由组件道具一起注入

const routeComponentFactory=(
组件:React.ComponentType,
道具:TProps
) => {
返回(routeProps:RouteComponentProps)=>{
返回;
};
};
如果我明确指定
TProps
,此函数将正常工作,例如:

接口MyComponentProps{a:number;b:number;}
常量MyComponent:React.FunctionComponent=()=>null;
routeComponentFactory(MyComponent,{});
我因为没有在对象中提供
a
b
而在那里得到一个错误

但是,如果我删除显式的
,错误就会消失,并且允许我使用空对象调用函数


如何使TypeScript正确推断MyComponentProps?

我看不到它允许我使用空对象调用函数,但在我的情况下,它抱怨MyComponent prop无效

问题似乎在于它是从第二个参数推断类型的——我猜是因为它匹配的是最简单的类型

您可以这样定义函数,强制它推断正确的类型:

const routeComponentFactory = <TProps extends {}>(
    Component: React.ComponentType<TProps>
) => (
    props: TProps
) => {
    return (routeProps: RouteComponentProps) => {
        return <Component {...routeProps} {...props} />;
    };
};

在这种情况下,它应该正确地抱怨空对象。

如果启用
strictFunctionTypes
,则会出现错误:

Type 'FunctionComponent<MyComponentProps>' is not assignable to type 'FunctionComponent<{}>'.

这是一个不错的选择,但在这种情况下不需要函数curry
Type 'FunctionComponent<MyComponentProps>' is not assignable to type 'FunctionComponent<{}>'.
const routeComponentFactory = <TProps extends {}>(
    Component: React.ComponentType<TProps>,
    props: TProps & {}
) => {
    return (routeProps: any) => {
        return <Component {...routeProps} {...props} />;
    };
};

interface MyComponentProps { a: number; b: number; }
const MyComponent: React.FunctionComponent<MyComponentProps> = () => null;


routeComponentFactory(MyComponent, {}); // Argument of type '{}' is not assignable to parameter of type 'MyComponentProps'