如何使用具有相同键但不同值类型的输入和输出对象键入函数?

时间:2016-03-09 14:21:29

标签: flowtype

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

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

转变为

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

3 个答案:

答案 0 :(得分:15)

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

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

答案 1 :(得分:4)

我认为你不能用Flow做到这一点。你可以得到的最接近的可能是:

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

键入该函数以返回具有与输入对象相同的键的对象,但使用仅布尔值(作为示例,您可以指定其他类型)。很抱歉让人失望,但很难用Flow输入高度动态的代码。

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

如果您对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 :(得分:0)

@Nikita现在给你最好的答案。也就是说,您所谈论的用例正在FlowType存储库的问题中讨论。它很快就会落地。

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

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

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