我一直在寻找将Flow添加到我的javascript项目中。
在某些情况下,我会这样做,我有一个对象。
const myObject = {
x: 12,
y: "Hello World"
}
我有一个通用函数可以对对象进行一些映射,保留键但是替换值。
function enfunctionate(someObject) {
return _.mapValues(myObject, (value) => () => value)
}
我希望函数返回类型{x: () => number, y: () => string}
有没有办法让这种情况发生?
当然,我可以将它更通用地命名为{[key: string]: any}
,但是我会失去很多我希望通过使用flow获得的静态类型。
如果我可以使用代码生成或可能有效的宏来替换我执行此操作的少数情况,但我看不到使用流程执行此操作的好方法。
有没有办法解决这个问题?
答案 0 :(得分:4)
这是目前最好的,虽然它比{[key: string]: any}
更安全但仍有any
参与
function enfunctionate<O: Object>(someObject: O): { [key: $Keys<O>]: (...rest: Array<void>) => any } {
return _.mapValues(someObject, (value) => () => value)
}
const obj = enfunctionate(myObject)
obj.x() // ok
obj.unknown() // error
编辑:从第33版开始,您可以使用$ObjMap
function enfunctionate<O>(o: O): $ObjMap<O, <V>(v : V) => () => V> {
return _.mapValues(o, (value) => () => value)
}
答案 1 :(得分:0)
Flow能够推断出很多东西。但是,如果要固定类型,则必须自己创建类型。您需要为要传递给enfunctionate
的对象创建一个类型,然后指定返回的类型。
您可以使用type alias键入该功能。因此,您可以为该函数创建一个新的显式类型。
function enfunctionate<X, Y>(x: X): Y {
return _.mapValues(myObject, (value) => () => value)
}
只要您知道X的类型,就知道Y的类型。类型别名,泛型和联合应该能够为您提供所需的灵活性。
然而,只要mapValues
的类型被指定好(希望由其他人指定),我也会想到你只需指定enfunctionate
所采用的类型即可。让Flow推断出该函数的返回类型。