这里我有一个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 }
答案 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;
};