flowtype 不能 return 对象字面量,因为对象类型不兼容

flowtype cannot return object literal because object type is incompatible

我有以下类型:

export type Transaction = {
  amount: number,
  description: string
}

export type TransactionsForMonth = {
  month: number,
  year: number,
  transactions: Array<Transaction>
}

export type TransactionsGroupedByDay = Array<{
  date: string,
  transactionsForDay: Array<Transaction>
}>

export type TransactionsForMonthGroupedByDay = {
  month: number,
  year: number,
  transactionsForMonth: Array<TransactionsGroupedByDay>,
}

我创建了一个从 TransactionsForMonth 转换为 TransactionsForMonthGroupedByDay 的函数,方法是减少交易并将它们分类为天数:

transactionsGroupedByDay ({ month, year, transactions }: TransactionsForMonth): TransactionsForMonthGroupedByDay {
  // transactions are already sorted in date order
  const transactionsGroupedByDay: TransactionsGroupedByDay = transactions.reduce((transactionsGroupedByDay, transaction) => {
    const thisDay = transactionsGroupedByDay.find(({ date }) => date === transaction.transactionDate)
    const transactionsThisDay = thisDay ? [...thisDay.transactionsForDay, transaction] : [transaction]
    return [
      ...transactionsGroupedByDay.filter(({ date }) => date !== transaction.transactionDate),
      {
        date: transaction.transactionDate,
        transactionsForDay: transactionsThisDay
      }
    ]
  }, [])
  return {
    month,
    year,
    transactionsForMonth: transactionsGroupedByDay
  }
}

当我 运行 流过这个函数时,我得到以下错误:

Cannot return object literal because object type [1] is incompatible with TransactionsGroupedByDay [2] in array element
of property transactionsForMonth. [incompatible-return]

     src/api/services/TransactionService.js
     55│     return {
     56│       month,
     57│       year,
     58│       transactionsForMonth: transactionsGroupedByDay
     59│     }
     60│   }
     61│

     src/api/types.js
 [1] 35│ export type TransactionsGroupedByDay = Array<{
     36│   date: string,
     37│   transactionsForDay: Array<Transaction>
     38│ }>
       :
 [2] 43│   transactionsForMonth: Array<TransactionsGroupedByDay>,

我是 flowtype 的新手,想知道这个错误是什么意思?

错误基本上是说,该函数应该 return 给定类型结构的对象,但是您的 return 语句不满足该要求。

原因是因为在 type TransactionsForMonthGroupedByDay 中你已经声明 属性 transactionsForMonth 是一个 TransactionsGroupedByDay 的数组但是你实际传递给 transactionsForMonth 你已经声明为 const transactionsGroupedByDay: TransactionsGroupedByDay 这是不兼容的。

您可以通过修复您的类型以接受单个 TransactionsGroupedByDay 或您的变量声明需要 return 一个 TransactionsGroupedByDay.

数组来解决此问题