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
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
Most helpful comment
@vkurchatkin
Not sure what you mean. This code block throws the error for me:
When running 'flow' on my codebase I see this
That block on core.js
Line being referenced:
Reference in code base: https://github.com/facebook/flow/blob/master/lib/core.js#L601