Flow: Promise.all: array type is incompatible with iterable.

Created on 13 Nov 2016  路  4Comments  路  Source: facebook/flow

const products = await Promise.all(Object.keys(cart.cartItems).map(cartItem => getProduct(cartItem)));

This line throws an error of:

array type This type is incompatible with Iterable See also: call of method `all`

I expected it to not throw an error because Promise.all accepts arrays.

Let me know if you need more information

Mac OS X 10.11.6 (15G31)
Flow: v0.35.0

Most helpful comment

@vkurchatkin

Not sure what you mean. This code block throws the error for me:

function promiseReturner(id: number): Promise<number> {
  return new Promise((resolve, reject) => resolve(id));
}

const arr = [1, 2, 3];

function promiseGenerator() {
  return Promise.all(arr.map(id => promiseReturner(id)));
}

When running 'flow' on my codebase I see this

server/router/webservice/inventory/index.js:20
 20:   return Promise.all(arr.map(id => promiseReturner(id)));
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ call of method `all`
 20:   return Promise.all(arr.map(id => promiseReturner(id)));
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ array type. This type is incompatible with
601:     static all<Elem, T:Iterable<Elem>>(promises: T): Promise<$TupleMap<T, typeof $await>>;
                            ^^^^^^^^^^^^^^ Iterable. See lib: /private/tmp/flow/flowlib_641b6b7/core.js:601

That block on core.js

/* Promises
   cf. https://github.com/borisyankov/DefinitelyTyped/blob/master/es6-promises/es6-promises.d.ts
*/

declare class Promise<+R> {
    constructor(callback: (
      resolve: (result: Promise<R> | R) => void,
      reject:  (error: any) => void
    ) => mixed): void;

    then<U>(
      onFulfill?: (value: R) => Promise<U> | U,
      onReject?: (error: any) => Promise<U> | U
    ): Promise<U>;

    catch<U>(
      onReject?: (error: any) => ?Promise<U> | U
    ): Promise<U>;

    static resolve<T>(object: Promise<T> | T): Promise<T>;
    static reject<T>(error?: any): Promise<T>;
    static all<Elem, T:Iterable<Elem>>(promises: T): Promise<$TupleMap<T, typeof $await>>;
    static race<T, Elem: Promise<T> | T>(promises: Array<Elem>): Promise<T>;
}

Line being referenced:

    static all<Elem, T:Iterable<Elem>>(promises: T): Promise<$TupleMap<T, typeof $await>>;

Reference in code base: https://github.com/facebook/flow/blob/master/lib/core.js#L601

All 4 comments

Can you make an isolated test case?

@vkurchatkin

Not sure what you mean. This code block throws the error for me:

function promiseReturner(id: number): Promise<number> {
  return new Promise((resolve, reject) => resolve(id));
}

const arr = [1, 2, 3];

function promiseGenerator() {
  return Promise.all(arr.map(id => promiseReturner(id)));
}

When running 'flow' on my codebase I see this

server/router/webservice/inventory/index.js:20
 20:   return Promise.all(arr.map(id => promiseReturner(id)));
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ call of method `all`
 20:   return Promise.all(arr.map(id => promiseReturner(id)));
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ array type. This type is incompatible with
601:     static all<Elem, T:Iterable<Elem>>(promises: T): Promise<$TupleMap<T, typeof $await>>;
                            ^^^^^^^^^^^^^^ Iterable. See lib: /private/tmp/flow/flowlib_641b6b7/core.js:601

That block on core.js

/* Promises
   cf. https://github.com/borisyankov/DefinitelyTyped/blob/master/es6-promises/es6-promises.d.ts
*/

declare class Promise<+R> {
    constructor(callback: (
      resolve: (result: Promise<R> | R) => void,
      reject:  (error: any) => void
    ) => mixed): void;

    then<U>(
      onFulfill?: (value: R) => Promise<U> | U,
      onReject?: (error: any) => Promise<U> | U
    ): Promise<U>;

    catch<U>(
      onReject?: (error: any) => ?Promise<U> | U
    ): Promise<U>;

    static resolve<T>(object: Promise<T> | T): Promise<T>;
    static reject<T>(error?: any): Promise<T>;
    static all<Elem, T:Iterable<Elem>>(promises: T): Promise<$TupleMap<T, typeof $await>>;
    static race<T, Elem: Promise<T> | T>(promises: Array<Elem>): Promise<T>;
}

Line being referenced:

    static all<Elem, T:Iterable<Elem>>(promises: T): Promise<$TupleMap<T, typeof $await>>;

Reference in code base: https://github.com/facebook/flow/blob/master/lib/core.js#L601

Seems to have been fixed; tried the above short example in both 0.39 and 0.37.2 with no errors.

Still reproduced on 0.64.0.
My code

const requests: AxiosPromise[] = someArray.map(() => axios.put('some/url));
const responses: AxiosResponse[] = await Promise.all(requests);

Error log:

$ flow
Error: src/services/apiService.js:44
 44:   const responses: AxiosResponse[] = await Promise.all(requests);
                                                            ^^^^^^^^ array type. This type is incompatible with
608:     static all<T: Iterable<mixed>>(promises: T): Promise<$TupleMap<T, typeof $await>>;
                       ^^^^^^^^^^^^^^^ $Iterable. See lib: C:\Users\_.h\AppData\Local\Temp\flow\flowlib_3a83ce6e\core.js:608
  Property `@@iterator` is incompatible:
    197:     @@iterator(): Iterator<T>;
             ^^^^^^^^^^^^^^^^^^^^^^^^^ function type. This type is incompatible with. See lib: C:\Users\___.h\AppData\Local\Temp\flow\flowlib_3a83ce6e\core.js:197
    503:     @@iterator(): $Iterator<Yield,Return,Next>;
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ function type. See lib: C:\Users\___.h\AppData\Local\Temp\flow\flowlib_3a83ce6e\core.js:503
      This parameter is incompatible:
        197:     @@iterator(): Iterator<T>;
                               ^^^^^^^^^^^ Iterator. This type is incompatible with. See lib: C:\Users\_.h\AppData\Local\Temp\flow\flowlib_3a83ce6e\core.js:197
        503:     @@iterator(): $Iterator<Yield,Return,Next>;
                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ $Iterator. See lib: C:\Users\_.h\AppData\Local\Temp\flow\flowlib_3a83ce6e\core.js:503
          Property `@@iterator` is incompatible:
            503:     @@iterator(): $Iterator<Yield,Return,Next>;
                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ property `@@iterator` of `$Iterator`. Property not found in. See lib: C:\Users\_.h\AppData\Local\Temp\flow\flowlib_
3a83ce6e\core.js:503
            197:     @@iterator(): Iterator<T>;
                                   ^^^^^^^^^^^ Iterator. See lib: C:\Users\_.h\AppData\Local\Temp\flow\flowlib_3a83ce6e\core.js:197

Error: src/services/apiService.js:44
 44:   const responses: AxiosResponse[] = await Promise.all(requests);
                                                            ^^^^^^^^ array type. This type is incompatible with
608:     static all<T: Iterable<mixed>>(promises: T): Promise<$TupleMap<T, typeof $await>>;
                       ^^^^^^^^^^^^^^^ $Iterable. See lib: C:\Users\_.h\AppData\Local\Temp\flow\flowlib_3a83ce6e\core.js:608
  Property `@@iterator` is incompatible:
    197:     @@iterator(): Iterator<T>;
             ^^^^^^^^^^^^^^^^^^^^^^^^^ function type. This type is incompatible with. See lib: C:\Users\_.h\AppData\Local\Temp\flow\flowlib_3a83ce6e\core.js:197
    503:     @@iterator(): $Iterator<Yield,Return,Next>;
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ function type. See lib: C:\Users\_.h\AppData\Local\Temp\flow\flowlib_3a83ce6e\core.js:503
      This parameter is incompatible:
        197:     @@iterator(): Iterator<T>;
                               ^^^^^^^^^^^ Iterator. This type is incompatible with. See lib: C:\Users\_.h\AppData\Local\Temp\flow\flowlib_3a83ce6e\core.js:197
        503:     @@iterator(): $Iterator<Yield,Return,Next>;
                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ $Iterator. See lib: C:\Users\_.h\AppData\Local\Temp\flow\flowlib_3a83ce6e\core.js:503
          Property `next` is incompatible:
                     v--------
            297:     next(): {
            298:         done: boolean,
            299:         value?: T
            300:     }
                     ^ function type. This type is incompatible with. See lib: node_modules/mobx/lib/mobx.js.flow:297
            498:     next(value?: Next): IteratorResult<Yield,Return>;
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ function type. See lib: C:\Users\_.h\AppData\Local\Temp\flow\flowlib_3a83ce6e\core.js:498
              This parameter is incompatible:
                                 v
                297:     next(): {
                298:         done: boolean,
                299:         value?: T
                300:     }
                         ^ object type. This type is incompatible with. See lib: node_modules/mobx/lib/mobx.js.flow:297
                498:     next(value?: Next): IteratorResult<Yield,Return>;
                                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ union: object type(s). See lib: C:\Users\_.h\AppData\Local\Temp\flow\flowlib_3a83ce6e\core.js:498
                  Member 1:
                  493:   | { done: true, value?: Return }
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ object type. See lib: C:\Users\_.h\AppData\Local\Temp\flow\flowlib_3a83ce6e\core.js:493
                  Error:
                  inconsistent use of library definitions
                                   v
                  297:     next(): {
                  298:         done: boolean,
                  299:         value?: T
                  300:     }
                           ^ object type. This type is incompatible with. See lib: node_modules/mobx/lib/mobx.js.flow:297
                  493:   | { done: true, value?: Return }
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ object type. See lib: C:\Users\_.h\AppData\Local\Temp\flow\flowlib_3a83ce6e\core.js:493
                    Property `done` is incompatible:
                      298:         done: boolean,
                                         ^^^^^^^ boolean. Expected boolean literal `true`. See lib: node_modules/mobx/lib/mobx.js.flow:298
                      493:   | { done: true, value?: Return }
                                       ^^^^ boolean literal `true`. See lib: C:\Users\___\AppData\Local\Temp\flow\flowlib_3a83ce6e\core.js:493
                  Member 2:
                  494:   | { done: false, value: Yield };
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ object type. See lib: C:\Users\___\AppData\Local\Temp\flow\flowlib_3a83ce6e\core.js:494
                  Error:
                  inconsistent use of library definitions
                                   v
                  297:     next(): {
                  298:         done: boolean,
                  299:         value?: T
                  300:     }
                           ^ object type. This type is incompatible with. See lib: node_modules/mobx/lib/mobx.js.flow:297
                  494:   | { done: false, value: Yield };
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ object type. See lib: C:\Users\_.h\AppData\Local\Temp\flow\flowlib_3a83ce6e\core.js:494
                    Property `done` is incompatible:
                      298:         done: boolean,
                                         ^^^^^^^ boolean. Expected boolean literal `false`. See lib: node_modules/mobx/lib/mobx.js.flow:298
                      494:   | { done: false, value: Yield };
                                       ^^^^^ boolean literal `false`. See lib: C:\Users\___\AppData\Local\Temp\flow\flowlib_3a83ce6e\core.js:494


Found 2 errors

Was this page helpful?
0 / 5 - 0 ratings

Related issues

philikon picture philikon  路  3Comments

funtaps picture funtaps  路  3Comments

pelotom picture pelotom  路  3Comments

marcelbeumer picture marcelbeumer  路  3Comments

ghost picture ghost  路  3Comments