Flow - 如何键入由嵌套在其中的对象组成的对象

时间:2018-06-05 19:09:01

标签: javascript flowtype

如何正确输入以下(未正确输入)功能?

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

1 个答案:

答案 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)