Skip to content

Regression for inferred unions in generic parameters #33490

Description

TypeScript Version: 3.7.0-dev.20190918

Search Terms: infer generic

Code

// simpler react typesdeclareclassComponent<P>{props: P;}exporttypeComponentClass<P>={new(props: P): Component<P>;};exporttypeFunctionComponent<P>=(props: P)=>null;exporttypeComponentType<P>=FunctionComponent<P>|ComponentClass<P>;// simpler react-router.d.tsexportinterfaceRouteComponentProps{route: string;}declarefunctionwithRouter<PextendsRouteComponentProps,CextendsComponentType<P>>(component: C&ComponentType<P>): ComponentClass<Omit<P,keyofRouteComponentProps>>;interfacePropsextendsRouteComponentProps{username: string;}declareconstMyComponent: 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:

/cc Oliver Joseph Ash (@OliverJAsh)

Metadata

Metadata

Labels

BugA bug in TypeScriptDomain: check: Type InferenceRelated to type inference performed during signature resolution or `infer` type resolutionFix AvailableA PR has been opened for this issue

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions