type PromisifyInterface<T extends Record<any, any>> = {
[K in keyof T]: T[K] extends (...args: any) => infer R
? (...args: Parameters<T[K]>) => R extends Promise<any> ? R : Promise<R>
: T[K];
};
interface TestInterface {
some(p1: number): void;
foo(p1: string): number;
bar(p1: string[]): string[];
zoo: number;
}
type Promisified = PromisifyInterface<TestInterface>;
// type Promisified = {
// some(p1: number): Promise<void>;
// foo(p1: string): Promise<number>;
// bar(p1: string[]): Promise<string[]>;
// zoo: number;
// }