type HasFunc = T extends (...args: unknown[]) => unknown ? true : T extends unknown[] ? { [K in keyof T]: HasFunc }[number] extends false ? false : true : T extends object ? { [K in keyof T]: HasFunc }[keyof T] extends false ? false : true : false export type ToFunc = { [K in keyof T]: T[K] extends (...args: infer Args) => infer Ret ? (...args: Args) => Promise> : HasFunc extends false ? () => Promise : T[K] extends object ? ToFunc : never } export interface RemoteCallData { paths: string[] args: unknown[] } // 下面的都是测试代码,用于测试 ToFunc type Assert = T interface TestObj { a1: number a2: number[] a3: [number, string] a4: { b: number c: [string] } a5: () => Promise a6: () => Promise a7: () => Promise<[number, string]> b: { b1: number b2: number[] b3: [number, string] b4: () => { b: number c: [string] } b5: () => Promise b6: () => Promise b7: () => Promise<[number, string]> } f: { b: number c: { d: () => number } } } export type TestA1 = Assert< ToFunc['a1'] extends () => Promise ? true : false > export type TestA2 = Assert< ToFunc['a2'] extends () => Promise ? true : false > export type TestA3 = Assert< ToFunc['a3'] extends () => Promise<[number, string]> ? true : false > export type TestA4 = Assert< ToFunc['a4'] extends () => Promise<{ b: number c: [string] }> ? true : false > export type TestA5 = Assert< ToFunc['a5'] extends () => Promise ? true : false > export type TestA6 = Assert< ToFunc['a6'] extends () => Promise ? true : false > export type TestA7 = Assert< ToFunc['a7'] extends () => Promise<[number, string]> ? true : false > export type TestB1 = Assert< ToFunc['b']['b1'] extends () => Promise ? true : false > export type TestB2 = Assert< ToFunc['b']['b2'] extends () => Promise ? true : false > export type TestB3 = Assert< ToFunc['b']['b3'] extends () => Promise<[number, string]> ? true : false > export type TestB4 = Assert< ToFunc['b']['b4'] extends () => Promise<{ b: number c: [string] }> ? true : false > export type TestB5 = Assert< ToFunc['b']['b5'] extends () => Promise ? true : false > export type TestB6 = Assert< ToFunc['b']['b6'] extends () => Promise ? true : false > export type TestB7 = Assert< ToFunc['b']['b7'] extends () => Promise<[number, string]> ? true : false > export type TestF = Assert< ToFunc['f']['b'] extends () => Promise ? true : false > export type TestF2 = Assert< ToFunc['f']['c']['d'] extends () => Promise ? true : false >