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

如何实现TypeScript自定义类型工具:提取抽象方法或具体成员

实现TypeScript抽象类成员提取工具类型

针对需求,我们可以通过TypeScript的条件类型、映射类型实现AbstractMethod和ConcretePart工具类型,直接从抽象类中提取抽象方法名或具体成员类型。

定义工具类型

1. 提取抽象方法名:AbstractMethod

遍历抽象类的实例成员,筛选出所有抽象方法的名称:

// 辅助类型:从给定类型中提取抽象方法的名称
type AbstractMethodNames<T> = {
  [K in keyof T]: T[K] extends abstract (...args: any[]) => any ? K : never
}[keyof T];

// 针对抽象类构造函数的工具类型
type AbstractMethod<T extends abstract new (...args: any[]) => any> = AbstractMethodNames<InstanceType<T>>;

2. 提取具体成员:ConcretePart

保留抽象类中所有非抽象成员,剔除抽象方法:

type ConcretePart<T extends abstract new (...args: any[]) => any> = Pick<
  InstanceType<T>,
  Exclude<keyof InstanceType<T>, AbstractMethodNames<InstanceType<T>>>
>;

测试示例

用你提供的抽象类C验证效果:

abstract class C {
    abstract abstr(): void
    method() {}
}

// 提取抽象方法名,类型为 'abstr'
type AbstrMethodName = AbstractMethod<typeof C>;

// 提取具体成员,类型为 { method: () => void }
type ConcreteMembers = ConcretePart<typeof C>;

应用场景适配

针对「处理类的并发定义时仅保留具体成员(优先保留第一个)」的场景,这类工具类型可配合联合类型处理逻辑:合并多个类成员时,先提取每个类的具体成员,再通过交叉类型或自定义合并逻辑保留第一个出现的具体成员,过滤后续的抽象或重复实现。

关于类继承扁平化中的抽象处理逻辑补充:

抽象处理
在类的菱形继承结构扁平化过程中,抽象成员的处理逻辑如下:

  1. 当多个父类存在同名抽象成员时,仅保留该成员的抽象定义,直到遇到提供具体实现的子类。
  2. 若某个成员在继承链中既有抽象定义又有具体实现,则以具体实现为准,忽略抽象定义。
  3. 对于并发定义的类(即多个类同时作为父类被继承),优先保留第一个出现的具体成员实现,后续的抽象或同名具体实现均被忽略。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 13:51:12