Array.prototype.reduce() can be typed in TypeScript

The return and initial value of the reduce() method can be typed using a generic.

In the example below, the array of products is converted to an object keyed by productId. This was safely typed with ProductsById being passed as a generic.

const products = [
{
productId: '12345',
name: 'Product A'
},
{
productId: '67890',
name: 'Product B'
}
];

type Product = { productId: string; name: string };
type ProductsById = Record<string, Product>;

// Transforms the array `products` into an object keyed by `productId`
const productsById = products.reduce<ProductsById>(
(previousValue, currentValue) => {
return {
...previousValue,
[currentValue.productId]: currentValue
};
},
{}
);

productsById;
// ^? const productsById: ProductsById

The result of productsById returns the below object which matches the ProductsById type:

{
"12345": {
"productId": "12345",
"name": "Product A"
},
"67890": {
"productId": "67890",
"name": "Product B"
}
}