如何正确输入以下(未正确输入)功能?
function myfunction<O, T:{ +[string]: any => O }>(inputObject: T): { ...O } {
let ret = {};
Object.values(inputObject).forEach(x => {
const out = inputObject[x]();
ret = {
...ret,
...out
}
});
return ret;
}
我希望能够接受诸如
之类的输入let inputObj = {
call1: () => ({
response1: {
}
}),
call2: () => ({
response2: {
}
})
}
myfunction(inputObj)
获取输出类型,在这种情况下将是
type outputObj = {
response1: {},
response2: {}
}
我尝试过实用程序函数的组合,例如$ ObjMap&lt;&gt;,但问题是我不知道如何创建一个新的对象,将嵌套的密钥提升到更高的级别。
这是一个有点人为的功能。最终我试图键入一个React HOC,为组件注入额外的道具,但注入的道具是HOC输入的函数,其形状为上面指定的inputObject
。
答案 0 :(得分:0)
这是我尝试将其送到{| response1: {} |} | {| response2: {} |}
的地方。它并没有真正回答你的问题,但也许你或其他人可以改进它。
(Try)
type ExtractReturnType = <V>(() => V) => V
function myfunction<O: {[key: string]: Function}>
(inputObject: O): {|...$Values<$ObjMap<O, ExtractReturnType>>|} {
return Object.keys(inputObject)
.reduce((acc, k) => Object.assign(acc, inputObject[k]()), {})
}
let inputObj = {
call1: () => ({
response1: {
blah: 'foo'
}
}),
call2: () => ({
response2: {
meh: 'bar'
}
})
}
type outputObj = {
response1: {},
response2: {}
}
type wrongOutputObj = {
response4: {},
}
const test1 = myfunction(inputObj)
const test2: outputObj = myfunction(inputObj)
//const test2: wrongOutputObj = myfunction(inputObj)