【问题标题】:How do I type a function with input and output objects with the same keys but different value types?如何键入具有相同键但值类型不同的输入和输出对象的函数?
【发布时间】:2016-06-23 23:32:11
【问题描述】:

基本上,我有一个函数可以将一个对象转换为另一个对象,它就像一个字典,但我不知道如何输入它。

var myFunctions = {
  a: () => something1,
  b: () => something2,
  [...]
}

变成了

var myObject = {
  a: something1,
  b: something2
  [...]
}

【问题讨论】:

    标签: flowtype


    【解决方案1】:

    我认为 Flow 无法做到这一点。你能得到的最接近的可能是这样的:

    function<T>(obj: T): ([key: $Keys<T>]: boolean)
    

    该函数的类型是返回一个与输入对象具有相同键的对象,但具有纯布尔值(例如,您可以指定另一种类型)。很抱歉让您失望了,但通常很难使用 Flow 输入高度动态的代码。

    请注意,$Keys 功能未记录在案,因为它不是公共 API 的一部分,因此其行为仅由其实现定义(换句话说,它可以随时更改)。

    如果您对 Flow 的类型系统的详细信息感兴趣,请查看 Flow 自带的 /lib 目录中的类型,例如 https://github.com/facebook/flow/blob/master/lib/core.js - 您会看到像 Object.assign 这样的一些内容特殊情况,因此您可能无法在自己的代码中重新实现这些东西。

    另外,请查看 http://sitr.us/2015/05/31/advanced-features-in-flow.html 以了解其他“美元功能”,例如 $Shape$Diff - 它部分已过时,但可以提供一些很好的指导。

    【讨论】:

      【解决方案2】:

      @Nikita 目前给了你最好的答案。也就是说,您谈到的用例正在 FlowType 存储库的问题中讨论。它可能很快就会降落。

      截至目前,如果你有混合类型,我会回退到any

      function<T>(obj: T): ([key: $Keys<T>]: any)
      

      这样,至少验证了键名。我希望在更多的 Flow 版本中,这个问题会得到解决。

      【讨论】:

        【解决方案3】:

        使用 Flow 0.33+,您可以使用 $ObjMap

        type ExtractCodomain = <V>(v: () => V) => V;
        declare function f<O>(o: O): $ObjMap<O, ExtractCodomain>;
        

        【讨论】:

        • 是否有任何可用的解释 - 它不一定是 Flow 上下文(这仍然没有记录在案)?我不知道我在看什么。
        • medium.com/@thejameskyle/flow-mapping-an-object-373d64c44592$ObjMap&lt;O, M&gt; 定义了一个对象类型,其键与现有类型相同,但每个属性的类型不同。第一个参数 (O) 是现有的对象类型。第二个参数是一个类型级别的函数,从原始对象类型中的某个属性的类型到新对象类型中相同属性的类型。就像Array.prototype.map() 通过转换输入数组中的每个值来创建一个新数组一样,$ObjMap 通过转换输入类型中的每个属性类型来创建一个新类型。
        • 仅供参考,这现在记录在flow.org/en/docs/types/utilities/#toc-objmap
        猜你喜欢
        • 2021-06-25
        • 2022-08-12
        • 1970-01-01
        • 1970-01-01
        • 2017-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-07
        相关资源
        最近更新 更多