[英]Get properties of class in typescript
我有以下课程:
export class Test {
private _rowsCount: string;
public get RowsCount(): string {
return this._rowsCount;
};
public set RowsCount(value: string) {
this._rowsCount = value;
};
private _rowsCount2: string;
public get RowsCount2(): string {
return this._rowsCount2;
};
public set RowsCount2(value: string) {
this._rowsCount2 = value;
};
}
我需要迭代特定类中的属性,我尝试了以下内容:
Object.keys(this).forEach((key)=> {
console.log(key);
});
但是这个迭代只涉及private
字段的问题,我也试过以下我得到了所有的methods
和properties
:
for (var property in this) {
if (this.hasOwnProperty(property)) {
console.log(property);
}
}
有没有人有办法解决吗?
谢谢!
如果你只需要获得getter / setter,那么你需要做类似的事情:
class Test {
...
public static getGetters(): string[] {
return Object.keys(this.prototype).filter(name => {
return typeof Object.getOwnPropertyDescriptor(this.prototype, name)["get"] === "function"
});
}
public static getSetters(): string[] {
return Object.keys(this.prototype).filter(name => {
return typeof Object.getOwnPropertyDescriptor(this.prototype, name)["set"] === "function"
});
}
}
Test.getGetters(); // ["RowsCount", "RowsCount2"]
Test.getSetters(); // ["RowsCount", "RowsCount2"]
( 游乐场代码 )
您可以将静态方法放在基类中,然后在扩展它时,子类也将具有这些静态方法:
class Base {
public static getGetters(): string[] {
return Object.keys(this.prototype).filter(name => {
return typeof Object.getOwnPropertyDescriptor(this.prototype, name)["get"] === "function"
});
}
public static getSetters(): string[] {
return Object.keys(this.prototype).filter(name => {
return typeof Object.getOwnPropertyDescriptor(this.prototype, name)["set"] === "function"
});
}
}
class Test extends Base {
...
}
Test.getGetters(); // work the same
( 游乐场代码 )
如果您希望这些方法是实例方法,那么您可以这样做:
class Base {
public getGetters(): string[] {
return Object.keys(this.constructor.prototype).filter(name => {
return typeof Object.getOwnPropertyDescriptor(this.constructor.prototype, name)["get"] === "function"
});
}
public getSetters(): string[] {
return Object.keys(this.constructor.prototype).filter(name => {
return typeof Object.getOwnPropertyDescriptor(this.constructor.prototype, name)["set"] === "function"
});
}
}
更改是使用this.constructor.prototype
而不是使用this.prototype
。
然后你简单地说:
let a = new Test();
a.getGetters(); // ["RowsCount", "RowsCount2"]
( 游乐场代码 )
基于@Twois的评论,他指出在定位es6时它不起作用,这里有一个可行的版本:
class Base {
public static getGetters(): string[] {
return Reflect.ownKeys(this.prototype).filter(name => {
return typeof Reflect.getOwnPropertyDescriptor(this.prototype, name)["get"] === "function";
}) as string[];
}
public static getSetters(): string[] {
return Reflect.ownKeys(this.prototype).filter(name => {
return typeof Reflect.getOwnPropertyDescriptor(this.prototype, name)["set"] === "function";
}) as string[];
}
}
主要区别:使用Reflect.ownKeys(this.prototype)
而不是Object.keys(this.prototype)
。
您可以做的是为了您想要使用它的类扩展上面的类并因此将属性公开;
class TestExposed extend Test {
public _rowsCount: string;
public _rowsCount2: string;
}
并在您的Test类中使私有受保护:
class Test {
protected _rowsCount: string;
public get RowsCount(): string {
return this._rowsCount;
};
public set RowsCount(value: string) {
this._rowsCount = value;
};
protected _rowsCount2: string;
public get RowsCount2(): string {
return this._rowsCount2;
};
public set RowsCount2(value: string) {
this._rowsCount2 = value;
};
}
然后你应该能够遍历外部类中的属性;
但是如果你想拥有这些价值观; 为什么不通过在数组中返回值或将它们记录为字符串来创建一个公开值的函数;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.