如何仅获取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
相关产品推荐
相关产品推荐

