Closed
Description
TypeScript Version: 3.7.0-dev.20190918
Search Terms: infer generic
Code
// simpler react types
declare class Component<P> {
props: P;
}
export type ComponentClass<P> = {
new (props: P): Component<P>;
};
export type FunctionComponent<P> = (props: P) => null;
export type ComponentType<P> = FunctionComponent<P> | ComponentClass<P>;
// simpler react-router.d.ts
export interface RouteComponentProps {
route: string;
}
declare function withRouter<
P extends RouteComponentProps,
C extends ComponentType<P>
>(
component: C & ComponentType<P>
): ComponentClass<Omit<P, keyof RouteComponentProps>>;
interface Props extends RouteComponentProps {
username: string;
}
declare const MyComponent: ComponentType<Props>;
// If I define `ComponentType` as `ComponentClass<P> | FunctionComponent<P>`:
// Argument of type 'ComponentType<Props>' is not assignable to parameter of type 'ComponentClass<Props> | (ComponentClass<Props> & FunctionComponent<Props>)'.
// If I define `ComponentType` as `FunctionComponent<P> | ComponentClass<P>`:
// Argument of type 'ComponentType<Props>' is not assignable to parameter of type 'FunctionComponent<Props> | (FunctionComponent<Props> & ComponentClass<Props>)'.
withRouter(MyComponent);
C & ComponentType<P>
helps inference. For a more comprehensive test suite check the react-router declarations and tests
A fix getting rid of C & ComponentType<P>
(DefinitelyTyped/DefinitelyTyped#38326) caused issues when using strictFunctionTypes
Expected behavior:
No type error
Actual behavior:
Throws with a different error message depending on the order of the union members in ComponentType
Playground Link:
playground for 3.5.3
Related Issues:
- how generic type and type inference works changed #33278
- Originally reported in react-router:
withRouter
fails withComponentType
starting in 3.6.2 DefinitelyTyped/DefinitelyTyped#38271
/cc @OliverJAsh