facebook / facebook/flow

Flow type errors when building higher-order components using intersection types

Open
#5,500 0 comments 2 reactions 0 assignees View on GitHub
Dominant language
Rust
Stars
22.3k
Forks
1.9k
PR merge metrics
No merged PRs in 30d

Description

Generic code: https://flow.org/try/#0PQKgBAAgZgNg9gdzCYAoVAXAngBwKZgDCcAtjnAHZ4UYAqueAPAAoB8YAvGABTc4BOcHAGcAXGGYBKTuwBucAJYATSQG5MDMAAkA8oUYAhdl0YBBdtwzjiZStToMzYAGRgj0juxvkqNevjNWdVQoAFcKAGMMBUowEjx+AHMmUwAaN1ZuAENxNLAAI3EDSVyXNzAAb1QwMH48DFD+CkqAOjas9LaW-IBfdR70MMjo2Ix+LIphKDh+EjN0o25Ct3SrIlIfe38UsvdrDbs-R3NK6tr6xubs3JKweWUZU5qajG54pLxs9PzJNTO+1ADELhKIxZoACzgEUMmWWxXEun0RieYAilGEGDACjIME4YECPDW3kODgCpl2rFuxN8pJSxnYVWeNTqDSaPAooRgMHEEywfyZYGAwBZlzAYwmUxmJCWq35YABAoFZxFbOxOBg-XQQA

Less generic code: https://flow.org/try/#0PQKgBAAgZgNg9gdzCYAoVAXAngBwKZgDCcAtjnAHZ4UYAqueAPAAoB8YAvGABTc4BOcHAGcAXGGYBKTuwBucAJYATSQG5MDMACEAcgEMSBLgG8KBvOOEZ+CigHMAvuuz4wACQDyhTmEYBBdm4McWIySmo6Bn8wADJtfUNWaQ52UPIqGnp8f1Z1VCgAVwoAYwwFSjBDfjs8BKY-ABp481ZuPXFGsAAjcV1zSQ7Y5sMwY1QwMH48DAL+ClGAOiW9JqWFrqdUB3RCkrKK6z0KYSg4fhI6nO4e4bwm4KJSdIis+qG+xIHHsIzI7IDRuNJtNZvM2h0vvJlDJARMJhhuFUanU2k0upI1EDNtt8kVSuV5gALODFFE3D54L6ebxjCbFShWMAKMgwHw5HgPNLhTJRPzvOpJEJPbl-ersFKwuHAmZzHgUAowGDiI5YTFSsDAYBTGXzQ7HU7nMn3NVgTbq9VA7Wgpks9TbIA

Pasting less generic code inline
```
/* @flow */

type ComponentType

= ((props: P) => void);
type BName = {name: string};
type HOC = (t: ComponentType) => ComponentType;

function mergeName(a: A, b: BName): A & BName {
return {...a, ...b};
}

function transformName(b: BName, t: ComponentType): ComponentType {
return (a: A): void => {
t(mergeName(a, b));
};
}

function hocName(b: BName): HOC {
const impl =
(t: ComponentType): ComponentType => {
return (null: any);
//return transformName(b, t);
};

return impl;
}
```

Typechecker literally prints the same type twice and complains that it is incompatible
```
This parameter is incompatible:
5: type HOC =
(t: ComponentType) => ComponentType;
^ ComponentType. Has some incompatible type argument with
18: const impl =
(t: ComponentType): ComponentType => {
^ ComponentType
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.