TypeScript推断接受函数作为参数的函数的返回类型

时间:2019-10-14 15:06:31

标签: javascript typescript types

我想推断一个接受函数作为参数的函数的返回类型。没有代码很难解释。所以我们开始:

const funcNumber = (arg: boolean) => (code: string) => Promise.resolve(100)
const funcString = (arg: boolean) => (code: string) => Promise.resolve("Hello")

const doSomethingCool = (callback) => (code: string) => {
    const requestMethod = callback(false)

    return Promise.all([requestMethod(code)])
}

const inferNumberType = doSomethingCool(funcNumber) // Promise<any[]> should be Promise<number[]>
const inferStringType = doSomethingCool(funcString) // Promise<any[]> should be Promise<string[]>

我希望inferNumberType具有类型Promise<number[]>inferStringType具有类型Promise<string[]>

由于我对TS知之甚少,所以不太确定如何实现它以及在哪里寻找解决方案。

这里是游乐场:here

1 个答案:

答案 0 :(得分:1)

如果添加通用类型参数并使用它正确键入callback参数,则所有参数都将按预期运行

const funcNumber = (arg: boolean) => (code: string) => Promise.resolve(100)
const funcString = (arg: boolean) => (code: string) => Promise.resolve("Hello")

const doSomethingCool = <R>(callback: (a:boolean) => (code: string)=> Promise<R>) => (code: string) => {
    const requestMethod = callback(false)

    return Promise.all([requestMethod(code)])
}

const inferNumberType = doSomethingCool(funcNumber)('') // Promise<number[]>
const inferStringType = doSomethingCool(funcString)('') //  Promise<string[]>

play