// prettier-ignore type Promisify = T extends { [""]: boolean } ? Promise> : T extends (...args: infer R1) => infer R2 ? (...args: R1) => Promisify : Promise; // prettier-ignore export type Remote = ( T extends (...args: infer R1) => infer R2 ? (...args: R1) => Promisify : unknown ) & ( T extends { new (...args: infer R1): infer R2 } ? { new (...args: R1): Promise> } : unknown ) & ( T extends Object ? { [K in keyof T]: Remote } : unknown ) & ( T extends string ? Promise : unknown ) & ( T extends number ? Promise : unknown ) & ( T extends boolean ? Promise : unknown )