基本上,我有一个将对象转换为不同对象的函数,它就像一个字典,但我不知道如何输入它。
var myFunctions = {
a: () => something1,
b: () => something2,
[...]
}
转变为
var myObject = {
a: something1,
b: something2
[...]
}
答案 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中,这个问题将得到解决。