You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从类数组中提取所有方法名到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"

关键修正点说明

  1. 构造函数转实例类型:使用InstanceType<T>将类的构造函数类型(如typeof A)转换为对应的实例类型(A),这是解决问题的核心。
  2. 过滤有效方法名:ExtractInstanceMethodKeys遍历实例类型的所有键,只保留值为函数类型的键,同时通过条件类型过滤掉非字符串类型的键(如Symbol)。
  3. 处理数组元素联合类型:T[number]获取数组中所有构造函数的联合类型,再通过InstanceType转换为实例的联合类型,最终提取所有方法名。

原代码错误分析

你之前的代码直接对构造函数类型(typeof A/typeof B)提取键,得到的是类的静态属性(如prototype、name),而非实例的方法名,缺少了构造函数转实例类型的关键步骤。

内容的提问来源于stack exchange,提问作者user3241778

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 08:30:58