facebook / flow

Adds static typing to JavaScript to improve developer productivity and code quality.
https://flow.org/
MIT License
22.07k stars 1.86k forks source link

Infinity type is not recognised in union type #3296

Open gajus opened 7 years ago

gajus commented 7 years ago

Flow v0.38.0.

Gives this type:

/* @flow */

export type DenormalizedSelectActionQuantifierType =
  {|
    +max: number,
    +min?: number,
    +multiple?: boolean
  |} |
  {|
    +max?: number,
    +min: number,
    +multiple?: boolean
  |} |
  {|
    +max?: number,
    +min?: number,
    +multiple: boolean
  |};

https://flowtype.org/try/#0PQKgBAAgZgNg9gdzCYAoVBTAHgBzgJwBcxCBPHDMAEQwDsCBbAQxgEsAvDAEwGUMYMAY0IBBYazi0AigFcmtQqyisM+ACrlKAXlRgwAbwA+uvWADUzLAC4wtGQwBGqgDQm9F1rQD8Nu45du5gwyMIo4Aj5gDnBwAvImhgC+YMZ6RoEWTFiRfk74rqZBnr72eQWmFiFhETbRsRjxekkpJumFmdkl-vkZDJ45pQHtwaGs4Ri1MXG0CYkA3OiCkgDOxACOMqqkNjT0+MxsnLz8QqLikrLyisqqGhRgWgYmljYArOV9tDYAzKjzQA

The following input is considered valid (expected):

const query: DenormalizedSelectActionQuantifierType = {
  max: 4,
  min: 3
};

The following input is not considered valid (unexpected):

const query: DenormalizedSelectActionQuantifierType = {
  max: Infinity,
  min: 3
};

https://flowtype.org/try/#0PQKgBAAgZgNg9gdzCYAoVBTAHgBzgJwBcxCBPHDMAEQwDsCBbAQxgEsAvDAEwGUMYMAY0IBBYazi0AigFcmtQqyisM+ACrlKAXlRgwAbwA+uvWADUzLAC4wtGQwBGqgDQm9F1rQD8Nu45du5gwyMIo4Aj5gDnBwAvImhgC+YMZ6RoEWTFiRfk74rqZBnr72eQWmFiFhETbRsRjxekkpJumFmdkl-vkZDJ45pQHtwaGs4Ri1MXG0CYkA3OiCkgDOxACOMqqkNjT0+MxsnLz8QqLikrLyisqqGhRgWgYmljYAkrTKtKxk5X20NgBmVDzIA

According to the documentation:

JavaScript has a single number type, which is IEEE 754 floating point numbers. The number type describes these values, which includes Infinity and NaN.

– https://flowtype.org/docs/builtins.html#number

For context, this is what I am trying to achieve:

http://stackoverflow.com/questions/41920643/how-to-define-a-flow-type-for-an-object-that-must-have-at-least-one-of-the-prope

gajus commented 7 years ago

In case anyone runs into this, explicitly naming all possible states works:

/* @flow */

export type DenormalizedSelectActionQuantifierType =
  {|
    +max: number
  |} |
  {|
    +min: number
  |} |
  {|
    +max: number,
    +min: number,
    +multiple?: boolean
  |} |
  {|
    +max?: number,
    +min?: number,
    +multiple: boolean
  |};

const query: DenormalizedSelectActionQuantifierType = {
  max: Infinity,
  min: 3
};

https://flowtype.org/try/#0PQKgBAAgZgNg9gdzCYAoVBTAHgBzgJwBcxCBPHDMAEQwDsCBbAQxgEsAvDAEwGUMYMAY0IBBYazi0AigFcmtQqyisM+ACrlKAXlRgwAbwA+uvWADUzLAC4wtGQwBGqk4YC+YY3qMm9F1rRs7R2c9Nw8Tb1NzS0D7J3wAGh9o-1jgxOSLGRhFHAEAfhsHODgBeRd3TwMq30tC2zjVJKi-Wnqg+ObTLJzWPIwikrLaCoBudEFJAGdiAEcZVVIbGnp8ZjZOXn4hUXFJWXlFZVUNCjAtAxMYsABJWmVaVjIuhlSwAGZUV1GgA