facebook / facebook/flow

Intersections have order dependent behavior

Open
#1,735 2 comments 10 reactions 0 assignees View on GitHub
Typing: spread Typing: unions/intersections
Dominant language
Rust
Stars
22.3k
Forks
1.9k
PR merge metrics
No merged PRs in 30d

Description

```
// @flow
type Foo = {
foo: string,
};

type Bar = {
bar: string,
} & Foo;

type Baz = Foo & {
baz: string,
};

const bat = (foo: Foo) => foo.foo;

export const invalid = ({ bar, ...baz }: Bar) => bar && bat(baz);
export const valid = ({ baz, ...bar }: Baz) => baz && bat(bar);
```

yields

```
src/components/test.js:15
15: export const invalid = ({ bar, ...baz }: Bar) => bar && bat(baz);
^^^^^^^^ function call
14: const bat = (foo: Foo) => foo.foo;
^^^ property `foo`. Property not found in
15: export const invalid = ({ bar, ...baz }: Bar) => bar && bat(baz);
^^^ object pattern spread property

Found 1 error
```

Apologies if the names are confusing, I was trying to reduce the problem to a minimal case. But the point is, `Bar` and `Baz` are, in practice, the same type, however, the intersection operator handles them very differently. I expect this is the root cause of issues such as #1511, #1118, #824, and #1462.

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.