我的问题:
我需要区分打字稿类的private,public和getter(获取X())属性。
我的项目:
我有一个Angular项目,该项目具有模型设计模式。 ka用户模型看起来像这样
class UserModel extends BaseModel {
private _id: number;
get id() { return this._id; }
set id( _id: number ) { this._id = _id; }
}
要将这些模型发送到后端,我只需对它们进行JSON.stringify()即可,如果将用户ID设置为13,则会返回类似这样的对象
{
_id: 13
}
现在,我需要修改UserModel上的toJSON()函数,以便代替返回对象的私有属性,而仅返回get X()变量。输出应如下所示。
{
id: 13
}
我做了这个简单的函数,以检索对象的所有属性,但是这给了我私有属性和get属性。
abstract class BaseModel {
public propsToObj() : {[key: string]: any} {
let ret: any = {};
for (var prop in this) {
ret[prop] = this[prop];
}
return ret;
}
}
和toJSON函数看起来像这样
class UserModel extends BaseModel {
private _id: number;
get id() { return this._id; }
set id( _id: number ) { this._id = _id; }
toJSON() {
return this.propsToObj();
}
}
将UserModel字符串化的结果如下所示:
{
_id: 13,
id: 13
}
最后,我需要了解类的属性的可见性和类型(getter或常规变量?),我将如何实现?
答案 0 :(得分:4)
您的[^a-z0-9][+]
工作不正确,它仅获取所有属性,您需要对其进行更改,以便仅获取吸气剂,例如,可以使用此
propsToObj()
abstract class BaseModel {
public propsToObj() : {[key: string]: any} {
let ret: any = {};
for (const prop in this) {
const descriptor = Object.getOwnPropertyDescriptor(this.constructor.prototype, prop);
if (descriptor && typeof descriptor.get === 'function') {
ret[prop] = this[prop];
}
}
return ret;
}
}
将获取属性的描述符,您可以从中检查描述符中是否有get函数,如果是则属性是getter,如果不是则为常规属性,则可以阅读有关描述符的更多信息这里MDN(descriptors)
您问的最后一个问题
我需要知道类的属性的可见性和类型,如何 我能做到吗?
据我所知,您无法获得属性的可见性,就类型而言,如果您想知道属性的数据类型,则可以使用Object.getOwnPropertyDescriptor
。
在propsToObj()方法中的示例:
typeof