Typescript Уменьшить, возвращая неверный - PullRequest
0 голосов
/ 16 апреля 2020

Я пытаюсь использовать сокращение для суммирования моего SQL ответа в двух категориях: доход и результат , но я получаю тип "currentValue" (транзакция) в качестве моего возврата вместо аккумулятора (BalanceDTO) я возвращаю только аккумулятор, как я получаю тип транзакции в качестве моего типа возврата?

Я действительно не знаю, что я делаю неправильно, я застрял в последние два часа.

import { getRepository } from 'typeorm';

import Transaction from '../models/Transaction';

interface BalanceDTO {
  income: number;
  outcome: number;
}

class GetBalanceService {
  public async execute(): Promise<BalanceDTO> {
    const transactionRepository = getRepository(Transaction);

    const transactions = await transactionRepository.find();

    const balance = transactions.reduce(
      (accumulator: BalanceDTO, transaction): BalanceDTO => {
        accumulator[transaction.type] += transaction.value;
        return accumulator; //// HERE -- How it is returning the transactions type? ////
      },
    );

    return balance;
  }
}

export default GetBalanceService;

Ответы [ 3 ]

2 голосов
/ 16 апреля 2020

Вам необходимо передать начальное значение для accumulator в качестве второго аргумента recude function:

const balance = transactions.reduce(
      (accumulator: BalanceDTO, transaction): BalanceDTO => {
        accumulator[transaction.type] += transaction.value;
        return accumulator; //// HERE -- How it is returning the transactions type? ////
      },
      {
          income: 0,
          outcome: 0
      }
    );
2 голосов
/ 16 апреля 2020

Вы пропустили определение начального значения и типа начального значения. Тип начального значения будет определять тип возврата функции reduce.

Я предлагаю определить начальное значение как BalanceDTO, а начальные значения равны нулю

const balance = transactions.reduce((accumulator, transaction) => {
  accumulator[transaction.type] += transaction.value;
  return accumulator;
}, {
    income: 0,
    outcome: 0,
} as BalanceDTO); // initialValue as a BalanceDTO

Теперь, balance является BalanceDTO

1 голос
/ 16 апреля 2020

Попробуйте это.

    const balance = transactions.reduce(
      (accumulator: BalanceDTO, transaction): BalanceDTO => {
        accumulator[transaction.type] += transaction.value;
        return accumulator;
      },{income: 0, outcome: 0} //you'd better set the initial value
    );

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

...