Я не могу объяснить, почему ошибка говорит именно то, что говорит, но эта строка неверна. push
возвращает число, а не массив, но transactionIds
должен быть массивом.
Если вы хотите каждый раз создавать новый объект, вы можете разложить существующие идентификаторы транзакций и добавить новый, например:
transactionIds: [...acc.transactionIds, currId]
Вы сказали, что у вас проблемы с тем, чтобы заставить это работать, и что TypeScript все еще жалуется на массив never[]
. Поскольку вам требуется, чтобы TypeScript выводил тип аккумулятора transactionIds
, я полагаю, что это неверный вывод.
Я бы определил тип:
interface ResultType {
amountAccumulated: number;
amountLeft: number;
rate: number | undefined;
transactionIds: string[];
}
и затем используйте его на объекте, который вы предоставляете для аккумулятора, чтобы TypeScript было ясно, какой тип transactionIds
:
const resultObject: ResultType = arrDocs.reduce(
(acc, curr, i) => {
// ...
},
<ResultType>{
amountAccumulated: 0,
amountLeft: spentAmount.amount,
rate: undefined,
transactionIds: []
}
);
Как примечание: использование reduce
для этого ничего не делает, а только усложняет. У вас также есть много избыточных аннотаций типов, которые TypeScript будет совершенно счастлив вывести (правильно). Вот как я к этому подхожу:
Во-первых, у меня был бы тип (хотя, если вы предпочитаете не делать этого, вам не обязательно):
interface ResultType {
amountAccumulated: number;
amountLeft: number;
transactionIds: string[];
rate: number | undefined;
}
Тогда я бы сделал это так:
let amountAccumulated = 0;
let amountLeft = 0;
let transactionIds: string[] = [];
for (const curr of arrDocs) {
let currData = curr.data();
if (currData !== undefined) {
let amountToAdd = Math.min(
currData.remaining_amount,
acc.amountLeft
);
amountAccumulated += amountToAdd;
amountLeft -= amountToAdd;
transactionIds.push(curr.id);
}
}
const resultObject: ResultType = {
amountAccumulated,
amountLeft,
rate: undefined,
transactionIds
};
Если вы не хотите иметь тип, просто замените его в последнем выражении, создающем объект:
const resultObject: {
amountAccumulated: number;
amountLeft: number;
transactionIds: string[];
rate: number | undefined;
} = {
amountAccumulated,
amountLeft,
rate: undefined,
transactionIds
};