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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 01:15:08