Intersections have order dependent behavior
- 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
Assessment
This issue has not been assessed yet.