创建一个从方法中获取返回值的通用类型

时间:2019-11-08 06:14:08

标签: typescript

这里我有一个Methods类,其中有一些简单的类。

class Methods {
    name = (): string => "bob"
    age = (): number => 42
    asyncAge = async (): Promise<number> => 42
}

我有一个可以从方法中获取所有值并创建并集的类型。

type UnionToIntersection<U> = 
  (U extends any ? (k: U)=>void : never) extends ((k: infer I)=>void) ? I : never

type MethodReturns<C, M extends Array<keyof C>> = UnionToIntersection<{
    [K in M[number]]: C[K] extends ((...args: any[]) => any) ? ReturnType<C[K]> : never
}[M[number]]>

type x = MethodReturns<Methods, ['name', 'asyncAge']>
// type x = string & Promise<number>

但是,这就是我想要的结果。我需要返回类型还必须包含方法名称作为属性。

// type x = { name: string } & { asyncAge: number } 

2 个答案:

答案 0 :(得分:0)

type ThenArg<T> = T extends Promise<infer U> ? U : T

type MethodReturns<C, M extends Array<keyof C>> = {
    [K in M[number]]: C[K] extends ((...args: any[]) => any) ? ThenArg<ReturnType<C[K]>> : never
}

答案 1 :(得分:0)

不确定您是否希望不必将该数组作为第二个泛型类型参数传递,但是如果是这样,则可以执行以下操作:

type UnwrapPromise<T> = T extends Promise<infer U> ? U : T;

type MethodReturns<Obj extends {}> = {
    [K in keyof Obj]: Obj[K] extends ((...args: any[]) => any)
        ? UnwrapPromise<ReturnType<Obj[K]>>
        : never;
};