利用函数输入和输出的通用类型

Generic type that taps on functions inputs and outputs

鉴于:

type SomeService = {
    someFunction:      (i: string) => number
    someOtherFunction: (i: string) => string[]
}

我想要一个通用类型,结果是:

type SomePromisifiedService = {
    someFunction:      (i: string) => Promise<number>
    someOtherFunction: (i: string) => Promise<string[]>
}

下面是一些可能更好地解释这一点的伪代码:

type PromisifyResults<T extends {}> = 
    { [k in keyof T]: (...T[k].args) => Promise<T[k].output> }

以下是使用 conditional types added in typescript 2.8 and generic rest parameters (typescript 3.0) 执行此操作的方法:

type PromisifyResults<T> = {
    [K in keyof T]:
        T[K] extends (...args: infer Args) => infer R
        ? (...args: Args) => Promise<R>
        : T[K]
}

Try in playground