为了账号安全,请及时绑定邮箱和手机立即绑定

流程错误:无法调用 `Object.entries(...).reduce` 因为`...` [1]

流程错误:无法调用 `Object.entries(...).reduce` 因为`...` [1]

UYOU 2022-06-16 15:45:13
我对 Flow 很陌生,我可能在这里遗漏了一些非常基本的东西。我有一个特定格式的对象,我正在将其转换为另一种格式。这可以通过多种方式完成,但我选择使用 Object.entries 来获取包含键/值对的数组,然后使用 reducer 函数处理条目数组,如下所示: 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 进行类型检查时(我花了一些时间试图弄清楚如何做到这一点),我不断在标题中收到错误。以下是我的一些尝试:FlowTry1FlowTry2FlowTry3(对我来说,编写流类型比编写实际的 js 花费更多时间;)。错误出现在 reducer 函数中,并且与 Flow 期望 Object.entries 键/值对中的第二个数组项“混合”(我认为)有关。但我想做的是告诉 Flow,对于这个函数,我们可以期望一个对象作为键/值数组中的值,如下所示:Type ExpectedCurrentItem = [string, { [string] : string} ] } 甚至更好: Type ExpectedCurrentItem = [string, { ['en' | 'nb'] : string} ] }(是的,我知道我可以用另一种方式解决这个问题,例如使用 Object.keys() 代替,并且我已经设法获得了一个没有 Flow 错误的替代解决方案,但显然我对 Flow 有一些不明白的地方逻辑,它唠叨我)。非常感谢任何见解!
查看完整描述

1 回答

?
慕虎7371278

TA贡献1802条经验 获得超4个赞

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


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

},{} )


查看完整回答
反对 回复 2022-06-16
  • 1 回答
  • 0 关注
  • 219 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信