Ошибка потока: Невозможно вызвать `Object.entries (...). Redu`, поскольку` ... `[1] несовместимо со смешанным [2] в индексе 1 второго аргумента. - PullRequest
0 голосов
/ 07 апреля 2020

Я довольно новичок в Flow и, возможно, мне здесь чего-то не хватает c.

У меня есть объект определенного формата, который я преобразовываю в другой формат. Это можно было сделать несколькими способами, но я решил использовать Object.entries, чтобы получить массив с парами ключ / значение, а затем функцию-редуктор, обрабатывающую массив записей, например:

 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, но, очевидно, что-то, чего я не понимаю, относительно логики потока c, и это меня терзает).

Любые идеи очень ценятся!

1 Ответ

0 голосов
/ 22 апреля 2020

Из-за отсутствия ответа на этот вопрос я переписал свой код, чтобы избавиться от ошибки потока:

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
},{} )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...