Skip to content

Order sensitivity bug in refinements for intersection types #4545

@alexkuz

Description

@alexkuz

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

/* @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];
...

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions