Javascript / Typescript-获取对象属性的可见性和类型

时间:2018-12-22 06:48:33

标签: javascript angular typescript

我的问题:

我需要区分打字稿类的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或常规变量?),我将如何实现?

1 个答案:

答案 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