【问题标题】:Typescript Reduce returning wrong TypeTypescript Reduce 返回错误的类型
【发布时间】:2020-07-29 03:42:10
【问题描述】:

我正在尝试使用 reduce 将我的 SQL 响应分为两类,incomeoutcome,但我得到的是“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;

【问题讨论】:

    标签: javascript typescript reduce


    【解决方案1】:

    您缺少定义初始值和初始值类型。初始值的类型将定义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

    【讨论】:

    • 感谢您的回复,它完美运行。为什么在某些情况下(我之前遇到的所有其他情况)在没有声明初始语句的情况下运行良好(就像 mozilla 文档中的第一个示例)?
    • @VictorThadeu "如果没有提供初始值,则数组中的第一个元素将用作初始累加器值并作为 currentValue 跳过。" - 文档。在某些情况下会很好,但我认为您需要输入 init 值才能清楚地说明。
    【解决方案2】:

    试试这个。

        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

    【讨论】:

    • 感谢您的回复,它完美运行。为什么在某些情况下(我之前遇到的所有其他情况)在没有声明初始语句的情况下运行良好(就像 mozilla 文档中的第一个示例)?
    【解决方案3】:

    您需要将accumulator 的初始值作为recude 函数的第二个参数传递:

    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
          }
        );
    

    【讨论】:

    • 感谢您的回复,它完美运行。为什么在某些情况下(我之前遇到的所有其他情况)在没有声明初始语句的情况下运行良好(就像 mozilla 文档中的第一个示例)?
    猜你喜欢
    • 2020-05-31
    • 2021-11-25
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    • 2019-08-21
    • 2018-11-16
    相关资源
    最近更新 更多