流程错误:无法调用Object.entries(...)。reduce,因为`...`[1]与第二个参数的索引1中的混合[2]不兼容

问题描述 投票:0回答:1

我对Flow来说还很陌生,在这里我可能缺少一些非常基本的东西。

我有某种格式的对象,正在将其转换为另一种格式。可以通过多种方式完成此操作,但是我选择使用Object.entries来获取具有键/值对的数组,然后使用reducer函数来处理entrys数组,如下所示:

 const langContent = { // The input object
  someKey: {
    en: 'Some en value',
    nb: 'Some nb value'
  },
  someOtherKey: {
    en: 'some other en Value',
    nb: 'some other nb Value'
  }
}

const useLanguages = ['nb', 'en']

const result = Object.entries( langContent ).reduce( ( obj, [key, val] ) => {

  useLanguages.forEach( ( langKey ) => {
    if ( ! obj[langKey] ) obj[langKey] = { translation:{} }
    obj[langKey].translation[key] = val[langKey]
  } )

  return obj
}, {} )

// Expected output object in the form of { en: translation: {someKey: 'some en value'}}

纯js的工作原理与预期的一样:jsfiddle

但是,当尝试使用Flow进行类型检查时(我花了一些时间试图弄清楚该怎么做),我一直在标头中看到错误。这是我的一些尝试:

FlowTry1

FlowTry2

FlowTry3

((我写流程类型要比写实际的js耗费很多时间。]

错误在于化简函数,与Flow预期Object.entries键/值对中的第二个数组项“混合”有关(我认为)。但是我想做的就是告诉Flow,对于这个函数,我们可以期望一个对象作为键/值数组中的值,例如:Type ExpectedCurrentItem = [string, { [string] : string} ] }甚至更好:Type ExpectedCurrentItem = [string, { ['en' | 'nb'] : string} ] }

((是的,我知道我可以用另一种方法来解决这个问题,例如使用Object.keys(),并且我设法获得了一个没有Flow错误的替代解决方案,但是显然我有些不了解Flow逻辑,这让我很烦)。

任何见解都非常感谢!

javascript flowtype
1个回答
0
投票

由于对这个问题缺乏响应,我重写了我的代码以消除流程错误:

type LangKeys = 'en' | 'nb'
type LangKeyValObj =  {[string]: string | void}
type LangObj = {[LangKeys] : {translation: LangKeyValObj} }

const useLanguages : $ReadOnlyArray<LangKeys> = [
  'nb',
  'en'
]

const resources : LangObj = useLanguages.reduce( ( obj: LangObj, langKey : LangKeys ) => {
  const trans = Object.keys( langContent ).reduce( ( o: LangKeyValObj, key: string ) => {
    o[key] = langContent[key][langKey]
    return o
  },{} )
  obj[langKey] = { translation: trans }
  return obj
},{} )
© www.soinside.com 2019 - 2024. All rights reserved.