【问题标题】:flowtype cannot return object literal because object type is incompatibleflowtype 无法返回对象文字,因为对象类型不兼容
【发布时间】:2020-10-22 15:19:05
【问题描述】:

我有以下几种:

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 的新手,想知道这个错误是什么意思?

【问题讨论】:

    标签: javascript node.js arrays types flowtype


    【解决方案1】:

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

    原因是因为在type TransactionsForMonthGroupedByDay 中,您已声明属性transactionsForMonth 是TransactionsGroupedByDay 的数组,但您实际传递给transactionsForMonth 的变量已声明为const transactionsGroupedByDay: TransactionsGroupedByDay,即不兼容。

    您可以通过将类型固定为接受单个 TransactionsGroupedByDay 或您的变量声明需要返回一个 TransactionsGroupedByDay 数组来解决此问题。

    【讨论】:

    • 谢谢!这是一个如此简单的不一致,我完全错过了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-15
    • 1970-01-01
    • 2017-11-09
    • 2013-04-20
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多