In the following:
@Mutation
remove_bought_products(productsToBeRemoved: Array<I.Product>) {
const tmpProductsInVendingMachine: Array<I.Product> = Object.values(this.productsInVendingMachine);
const reducedProductsInVendingMachine: Array<I.Product> =
tmpProductsInVendingMachine.reduce((tmpProductsInVendingMachine, { id, ...rest }) => ({ ...tmpProductsInVendingMachine, ...{ [id]: { id, ...rest } } }), {});
productsToBeRemoved.forEach(({ id }) => reducedProductsInVendingMachine[id].productQty--);
...
gives:
TS2740: Type '{}' is missing the following properties from type 'Product[]': length, pop,
push, concat, and 28 more.
250 |
251 | const tmpProductsInVendingMachine: Array<I.Product> = Object.values(this.productsInVendingMachine);
> 252 | const reducedProductsInVendingMachine: Array<I.Product> =
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
253 | tmpProductsInVendingMachine.reduce((tmpProductsInVendingMachine, { id, ...rest }) => ({ ...tmpProductsInVendingMachine, ...{ [id]: { id, ...rest } } }), {});
254 | productsToBeRemoved.forEach(({ id }) => reducedProductsInVendingMachine[id].productQty--);
What type does the reducer return?
Products are objects that need to be indexed over their id; e.g.
[{
id: 1,
productName: "coke",
productPrice: 2,
productQty: 20
},
...
]
CodePudding user response:
reducedProductsInVendingMachine
is not an Array
, its an Object
.
One possibility is to cast {}
to the correct type in the initialization parameter of Array.prototype.reduce()
:
const reducedProductsInVendingMachine =
tmpProductsInVendingMachine.reduce(
(tmpProductsInVendingMachine, { id, ...rest }) =>
({ ...tmpProductsInVendingMachine, ...{ [id]: { id, ...rest } } }),
{} as { [key: I.Product['id']]: I.Product }
);
Notice how the implementation compiles and the reducedProductsInVendingMachine
variable type is correctly inferred to { [key: I.Product['id']]: I.Product }
(with I.Product['id']
resolved to whatever it is)