TypeScript如何提取子类独有属性,排除父类属性及类方法?
TypeScript泛型函数仅允许传入子类自有属性解决方案
核心实现思路
通过自定义工具类型逐层过滤属性,先后排除父类继承属性、函数类型属性,按需筛选可写/带setter属性。
1. 基础定义(沿用示例代码)
class Base { public b1: string = '' public b2: number = 0 ping(): void {} } class Child extends Base { public c1: string = '' public c2: number = 0 set c3(value: number) { } pong(): void {} }
2. 排除父类继承属性的工具类型
// 泛型参数T为子类类型,Base为父类类型,返回子类独有的属性集合 type OwnProperties<T, Base> = Omit<T, keyof Base>
3. 基础版函数实现(满足核心需求)
function test<T extends Base>(props: OwnProperties<T, Base>): void { // 业务逻辑实现 }
此时调用test<Child>的行为完全符合预期:
- 传入
c1、c2正常通过校验 - 传入父类属性
b1、b2直接抛出类型错误 - 给
c3传入非number类型的值抛出类型错误
附加需求实现
1. 排除函数类型属性
新增工具类型过滤掉所有值为函数的属性:
type NonFunctionProperties<T> = { [K in keyof T as T[K] extends Function ? never : K]: T[K] }
2. 仅允许可写/带setter的属性
新增工具类型过滤只读属性,仅保留可写入的属性(含setter属性):
type WritableProperties<T> = { -readonly [K in keyof T as {} extends Pick<T, K> ? never : K]: T[K] }
3. 最终版组合实现
// 组合所有过滤规则:子类自有 + 非函数 + 可写 type AllowedProperties<T, Base> = WritableProperties<NonFunctionProperties<OwnProperties<T, Base>>> function test<T extends Base>(props: AllowedProperties<T, Base>): void { // 业务逻辑实现 }
最终效果:test<Child>仅允许传入c1、c2、c3三个符合规则的属性,其余所有属性传入均会抛出类型错误。
内容的提问来源于stack exchange,提问作者username_not_found
相关产品推荐
相关产品推荐

