Flow:对象类型与Array <mixed>不兼容

时间:2017-11-08 18:38:02

标签: javascript flowtype flow-typed

我不明白我目前得到的流量错误。我有一个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,
    };
  });

但是我收到以下flowtype错误:

flow error

我不确定如何匹配这些类型。目前我的DataObject流类型是

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

任何帮助将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:5)

Object.values函数的类型定义无法知道传递给它的参数是一个值,它们的值都是相同的类型。您可以轻松地执行Object.values({foo: 4, bar: "str"})The type definition is

(any) => Array<mixed>

表示您对.map类型的值进行Array<mixed>

这意味着如果您想将其用作对象,则您的方法将无效。假设您的“对象对象”被输入为

type DataObjects = {
  [string]: DataObject,
}

你可能会做得更好

function values(objs: DataObjects): Array<DataObject> {
  Object.keys(objs).map(key => objs[key]);
}

答案 1 :(得分:1)

如果您更喜欢使用Object.values()(可能更有效)并具有正确的键入权限,则可以使用如下帮助函数:

 function objectToValues<A, B>(obj:{[key: A]: B} ): Array<B> {
    return ((Object.values(obj): any): Array<B>)
 }