【问题标题】:Flow: Object type incompatible with Array<mixed>流:对象类型与 Array<mixed> 不兼容
【发布时间】:2018-04-21 14:02:22
【问题描述】:

我不明白我目前遇到的流程错误。我有一个对象的 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,
};

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

【问题讨论】:

    标签: javascript flowtype flow-typed


    【解决方案1】:

    Object.values 函数的类型定义无法知道传递给它的参数是一个值都是相同类型的对象。你可以很容易地做Object.values({foo: 4, bar: "str"})The type definition is

    (any) => Array<mixed>
    

    意味着您正在对 Array&lt;mixed&gt; 类型的值执行 .map

    这意味着如果你想将它用作对象,你的方法将不起作用。假设您的“对象对象”的类型为

    type DataObjects = {
      [string]: DataObject,
    }
    

    你可能会做得更好

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

    【讨论】:

    • 我可以发誓,这太令人沮丧了。您的回答是社区 2 年来的字面“最佳案例”。这是可悲的。 Ty 的帮助,拿走我的 updoot。
    【解决方案2】:

    如果您更喜欢使用 Object.values() (可能更有效)并且有正确的输入,您可以使用如下的辅助函数:

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

    【讨论】:

    • 这可行,但不建议使用any,因为它在 Flow 严格文件中是不允许的。
    猜你喜欢
    • 1970-01-01
    • 2021-10-10
    • 2019-02-08
    • 2018-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多