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

如何仅获取TypeScript子类自身属性,排除继承自父类的属性?

获取TypeScript子类实例自身的私有属性(排除父类继承属性)

针对你遇到的问题,这里提供几种可行的解决方案:

方案1:对比父类实例的自有属性列表

由于TypeScript的private修饰符编译后会将属性转为实例自有属性,父类的私有属性也会出现在子类实例中。可以先获取父类实例(或模拟父类实例)的属性列表,再过滤子类实例的属性:

// 模拟父类实例(适用于B是抽象类的情况)
const parentInstance = Object.create(B.prototype);
B.call(parentInstance); // 调用父类构造函数初始化属性
const parentProps = Object.getOwnPropertyNames(parentInstance);

// 过滤得到子类自身属性
const aOwnProps = Object.getOwnPropertyNames(a).filter(prop => !parentProps.includes(prop));
// 结果:['prop1', 'prop2']

如果B不是抽象类,直接用new B()生成父类实例即可。

方案2:手动维护自身属性列表

在子类A中添加静态属性,显式列出自身的实例属性,后续直接取用:

export class A extends B {
  private prop1: string;
  private prop2: string;
  // 静态属性存储自身实例属性名
  static readonly ownInstanceProps = ['prop1', 'prop2'];
  
  constructor() {
    super();
    this.prop1 = "A";
    this.prop2 = "A";
  }
}

// 获取自身属性
const aOwnProps = A.ownInstanceProps;

这种方法简单直接,适合属性数量少且稳定的场景。

方案3:用装饰器自动收集属性

通过TypeScript装饰器自动标记并收集类的实例属性,避免手动维护的繁琐:

// 定义装饰器
function TrackInstanceProp(target: any, propName: string) {
  const constructor = target.constructor;
  if (!constructor.ownInstanceProps) {
    constructor.ownInstanceProps = [];
  }
  if (!constructor.ownInstanceProps.includes(propName)) {
    constructor.ownInstanceProps.push(propName);
  }
}

export class A extends B {
  @TrackInstanceProp
  private prop1: string;
  @TrackInstanceProp
  private prop2: string;
  
  constructor() {
    super();
    this.prop1 = "A";
    this.prop2 = "A";
  }
}

// 获取自身属性
const aOwnProps = (a.constructor as typeof A).ownInstanceProps;

注意需要在tsconfig.json中开启experimentalDecorators配置项。

方案4:改用ES原生私有字段

如果编译目标支持ES2022及以上,可使用ES原生私有字段(#前缀)替代TypeScript的private修饰符。原生私有字段严格绑定到所属类,子类实例不会包含父类的私有字段:

export class A extends B {
  #prop1: string;
  #prop2: string;
  
  constructor() {
    super();
    this.#prop1 = "A";
    this.#prop2 = "A";
  }
  
  // 需手动提供方法暴露私有属性名(原生私有字段无法通过Object.getOwnPropertyNames直接获取)
  getOwnPrivatePropNames() {
    return ['#prop1', '#prop2'];
  }
}

export abstract class B {
  #prop3: "B";
  
  constructor() {
    this.#prop3 = "B";
  }
}

// 获取自身私有属性名
const aOwnProps = a.getOwnPrivatePropNames();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 18:35:00