Поток: Тип объекта несовместим с Array‹mixed›

Я не понимаю ошибку потока, которую я сейчас получаю. У меня есть объект объектов Javascript (dataObject), который я хочу преобразовать в массив объектов, поэтому я делаю это с помощью Object.values(dataObject). Затем я перебираю каждый объект в массиве со следующим:

  const dataObjectArray = Object.values(dataObject);
  return dataObjectArray((data: DataObject) => {
    const { typeA, typeB } = data;
    return {
      TYPE_A: typeA,
      TYPE_B: typeB,
    };
  });

Но я получаю следующую ошибку типа потока:

ошибка потока

Я не знаю, как сопоставить типы. В настоящее время мой тип потока DataObject

type DataObject = {
    typeA: string,
    typeB: string,
};

Любая помощь будет оценена по достоинству. Спасибо!


person user3802348    schedule 08.11.2017    source источник


Ответы (2)


Определение типа для функции Object.values не может знать, что переданный ей аргумент является объектом, все значения которого относятся к одному типу. Вы могли бы так же легко делать Object.values({foo: 4, bar: "str"}). Определение типа

(any) => Array<mixed>

это означает, что вы делаете .map со значением типа Array<mixed>.

Это означает, что если вы хотите использовать его как объект, ваш метод не будет работать. Предполагая, что ваш «объект объектов» набирается как

type DataObjects = {
  [string]: DataObject,
}

Вам, вероятно, лучше сделать

function values(objs: DataObjects): Array<DataObject> {
  return Object.keys(objs).map(key => objs[key]);
}
person loganfsmyth    schedule 08.11.2017
comment
Я ругался на ТАК - это так неприятно. Ваш ответ — буквально лучший случай, который был у сообщества за 2 года. Это жалко. Ты за помощь, возьми мой updoot. - person The Dembinski; 26.08.2018

Если вы предпочитаете использовать Object.values() (вероятно, более эффективный) и имеете право печатать, вы можете использовать вспомогательную функцию, подобную этой:

 function objectToValues<A, B>(obj:{[key: A]: B} ): Array<B> {
    return ((Object.values(obj): any): Array<B>)
 }
person Dominique PERETTI    schedule 08.08.2018
comment
Это работает, но использование any не рекомендуется, так как это не разрешено в файлах Flow strict. - person Yangshun Tay; 10.05.2020