如何从类数组中提取所有方法名到TypeScript联合类型?
提取类数组所有实例方法名的TypeScript联合类型
你的问题核心是误将构造函数类型当作实例类型处理,导致提取的是类的静态属性而非实例方法名。下面是修正后的实现方案:
正确代码实现
// 先定义依赖类型(示例用) class Book {} class User {} class A{ getBooks(): Book[] { return [] } getBook(): Book { return new Book() } } class B{ getUsers(): User[] { return [] } getUser(): User { return new User() } getBooksOfUser(userId: string): Book[] { return [] } } // 提取单个实例类型中的方法名 type ExtractInstanceMethodKeys<T> = { [P in keyof T]: T[P] extends Function ? P : never }[keyof T] extends infer U ? U extends string ? U : never : never; // 处理构造函数数组,生成所有实例方法名的联合类型 type AllClassMethodNames<T extends readonly (abstract new (...args: any) => any)[]> = ExtractInstanceMethodKeys<InstanceType<T[number]>>; // 定义类构造函数数组(const断言确保类型不被拓宽) const testResolvers = [A, B] as const; // 生成目标联合类型 type allMethods = AllClassMethodNames<typeof testResolvers>; // 结果:"getBooks" | "getBook" | "getUsers" | "getUser" | "getBooksOfUser"
关键修正点说明
- 构造函数转实例类型:使用
InstanceType<T>将类的构造函数类型(如typeof A)转换为对应的实例类型(A),这是解决问题的核心。 - 过滤有效方法名:
ExtractInstanceMethodKeys遍历实例类型的所有键,只保留值为函数类型的键,同时通过条件类型过滤掉非字符串类型的键(如Symbol)。 - 处理数组元素联合类型:
T[number]获取数组中所有构造函数的联合类型,再通过InstanceType转换为实例的联合类型,最终提取所有方法名。
原代码错误分析
你之前的代码直接对构造函数类型(typeof A/typeof B)提取键,得到的是类的静态属性(如prototype、name),而非实例的方法名,缺少了构造函数转实例类型的关键步骤。
内容的提问来源于stack exchange,提问作者user3241778
相关产品推荐
相关产品推荐

