我正在开发一个angular 2应用程序。在开发时,我开始使用JavaScript类创建对象,我通过HTTP接收,或者在表单中创建一个新对象。
例如,这个类可能是这样的。

export class Product {
    public id: number;
    public name: string;
    public description: string;
    public price: number;
    private _imageId: number;
    private _imageUrl: string;

    constructor(obj: Object = {}) {
        Object.assign(this, obj);
    }

    get imageId(): number {
        return this._imageId;
    }
    set imageId(id: number) {
        this._imageId = id;
        this._imageUrl = `//www.example.org/images/${id}`;
    }

    get imageUrl(): string {
        return this._imageUrl;
    }

    public getDTO() {
        return {
            name: this.name,
            description: this.description,
            imageId: this.imageId,
            price: this.price
        }
    }
}

到目前为止,上面所示的解决方案非常有效。但是现在我们假设对象中有更多的属性,我想要一个干净的dto(例如没有私有属性)通过post将这个对象发送到我的服务器。一个更通用的getDTO()函数是什么样子的?我想避免有一长串的财产转让清单。我在考虑用装修工来装修房子。但我不知道如何使用它们来过滤dto的属性。

最佳答案

您可以使用property decorator来执行以下操作:

const DOT_INCLUDES = {};

function DtoInclude(proto, name) {
    const key = proto.constructor.name;
    if (DOT_INCLUDES[key]) {
        DOT_INCLUDES[key].push(name);
    } else {
        DOT_INCLUDES[key] = [name];
    }
}

class A {
    @DtoInclude
    public x: number;
    public y: number;

    @DtoInclude
    private str: string;

    constructor(x: number, y: number, str: string) {
        this.x = x;
        this.y = y;
        this.str = str;
    }

    toDTO(): any {
        const includes: string[] = DOT_INCLUDES[(this.constructor as any).name];
        const dto = {};

        for (let key in this) {
            if (includes.indexOf(key) >= 0) {
                dto[key] = this[key];
            }
        }

        return dto;
    }
}

let a = new A(1, 2, "string");
console.log(a.toDTO()); // Object {x: 1, str: "string"}

code in playground
你可以在他们的例子中使用“AA>”,如果你想要的话,我用DOT_INCLUDES注册表实现它,这样它就可以在操场内正常工作,而不需要额外的依赖。
编辑
正如@bergi所评论的,您可以遍历includes而不是this
toDTO(): any {
    const includes: string[] = DOT_INCLUDES[(this.constructor as any).name];
    const dto = {};

    for (let ket of includes) {
        dto[key] = this[key];
    }

    return dto;
}

这确实更有效率,更有意义。

07-28 09:20