Flow error: Cannot call `Object.entries(...).reduce` because `...` [1] is incompatible with mixed [2] in index 1 of the second argument
Flow error: Cannot call `Object.entries(...).reduce` because `...` [1] is incompatible with mixed [2] in index 1 of the second argument
我是 Flow 的新手,我可能遗漏了一些非常基本的东西。
我有一个特定格式的 object,我正在将其转换为另一种格式。这可以通过多种方式完成,但我选择使用 Object.entries 来获取具有 key/value 对的数组,然后是处理条目数组的缩减器函数,如下所示:
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 进行类型检查时(我花了一些时间试图弄清楚如何做到这一点),我不断在 header 中收到错误。以下是我的一些尝试:
(我写流程类型比写实际的 js 更耗时;)。
错误出现在 reducer 函数中,并且与 Flow 期望 Object.entries key/value 对中的第二个数组项为 "mixed"(我认为)有关。但我想做的是告诉 Flow,对于这个函数,我们可以期望 object 作为 key/value 数组中的值,如下所示:Type ExpectedCurrentItem = [string, { [string] : string} ] }
或者更好:
Type ExpectedCurrentItem = [string, { ['en' | 'nb'] : string} ] }
(是的,我知道我可以用另一种方式解决这个问题,例如使用 Object.keys() 代替,我已经设法获得了一个没有 Flow 错误的替代解决方案,但显然我有一些东西不明白 Flow 逻辑,这让我很烦)。
非常感谢任何见解!
由于对这个问题没有回应,我重写了我的代码以消除流程错误:
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
},{} )
我是 Flow 的新手,我可能遗漏了一些非常基本的东西。
我有一个特定格式的 object,我正在将其转换为另一种格式。这可以通过多种方式完成,但我选择使用 Object.entries 来获取具有 key/value 对的数组,然后是处理条目数组的缩减器函数,如下所示:
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 进行类型检查时(我花了一些时间试图弄清楚如何做到这一点),我不断在 header 中收到错误。以下是我的一些尝试:
(我写流程类型比写实际的 js 更耗时;)。
错误出现在 reducer 函数中,并且与 Flow 期望 Object.entries key/value 对中的第二个数组项为 "mixed"(我认为)有关。但我想做的是告诉 Flow,对于这个函数,我们可以期望 object 作为 key/value 数组中的值,如下所示:Type ExpectedCurrentItem = [string, { [string] : string} ] }
或者更好:
Type ExpectedCurrentItem = [string, { ['en' | 'nb'] : string} ] }
(是的,我知道我可以用另一种方式解决这个问题,例如使用 Object.keys() 代替,我已经设法获得了一个没有 Flow 错误的替代解决方案,但显然我有一些东西不明白 Flow 逻辑,这让我很烦)。
非常感谢任何见解!
由于对这个问题没有回应,我重写了我的代码以消除流程错误:
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
},{} )