如何实现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>;
应用场景适配
针对「处理类的并发定义时仅保留具体成员(优先保留第一个)」的场景,这类工具类型可配合联合类型处理逻辑:合并多个类成员时,先提取每个类的具体成员,再通过交叉类型或自定义合并逻辑保留第一个出现的具体成员,过滤后续的抽象或重复实现。
关于类继承扁平化中的抽象处理逻辑补充:
抽象处理
在类的菱形继承结构扁平化过程中,抽象成员的处理逻辑如下:
- 当多个父类存在同名抽象成员时,仅保留该成员的抽象定义,直到遇到提供具体实现的子类。
- 若某个成员在继承链中既有抽象定义又有具体实现,则以具体实现为准,忽略抽象定义。
- 对于并发定义的类(即多个类同时作为父类被继承),优先保留第一个出现的具体成员实现,后续的抽象或同名具体实现均被忽略。
内容的提问来源于stack exchange,提问作者eddow
相关产品推荐
相关产品推荐

