我正在开发一个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;
}
这确实更有效率,更有意义。