facebook / facebook/flow

Order sensitivity bug in refinements for intersection types

Open
#4,545 1 comment 0 reactions 0 assignees View on GitHub
bug Typing: unions/intersections
Dominant language
Rust
Stars
22.3k
Forks
1.9k
PR merge metrics
No merged PRs in 30d

Description

This code throws an error (see https://flow.org/try/#0PQKgBAAgZgNg9gdzCYAoVAXAngBwKZgDyARgFZgC8YA3qmGAIYBcYAdgK4C2xeATmKgC+YAGQ06YYiwDOGXgEtWAcwGCA3OijtWAYwzy4rMBjyyAFDDxQMLEqQA0YBUoAWNomQCU4+rzwZ2XiM7PD0AOgBrPCxpCysMTzCoRQATMwjKAD4fejBpBHkMHRcwdO9aXNydBmkCAHJiOpY-AKCwS2sAbQiAXUoKKmc3bp6NSvpq2rA6hianf0CjDowR-sH5VxXesdzBCUFPDT3USwx2+MoaRhYARkcpaYAPOrB1E-8nDbdL6muwACZ7iw6lgXm9MKYMHFrI4hgkNEA):

```js
/* @flow */

type Obj = {
a: number
} & {
b: string
};

function test(left: Obj, right: Obj) {
return Object.keys(left).find(k => {
switch (k) {
case 'b': return left[k] === right[k];
case 'a': return left[k] === right[k];
}
});
}

let left = { a: 1, b: 'x' };
let right = { a: 2, b: 'y' };

test(left, right);
```

```
12: case 'b': return left[k] === right[k];
^ property `b`. Property not found in
3: type Obj = { ^ object type
12: case 'b': return left[k] === right[k];
^ property `b`. Property not found in
3: type Obj = { ^ object type
```

It works fine though if we switch `case 'a'` and `case 'b'`:

```
...
case 'a': return left[k] === right[k];
case 'b': return left[k] === right[k];
...
```

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.