请考虑以下代码:
export class Model {
constructor(input: any) {
this.deserialize(input);
}
deserialize(input: any): Model {
Object.assign(this, input);
return this;
}
}
export class Body extends Model {
Success: boolean;
@Relationship Result: Result;
//...
}
export class Result extends Model {
Skip: number;
Top: number;
TotalCount: number;
//...
}
脚本接收json并启动Body
类的新实例:
//...
let body = new Body({
Sucess: true,
Result: {
Skip: 0,
Top: 0,
TotalCount: 20
//...
}
//...
});
deserialize
方法用于将所有可枚举的自有属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。
要使Result
属性正确启动,deserialize
方法需要进行更改:
deserialize(input: any): Model {
Object.assign(this, input);
this.Result = new Result(input.Result);
return this;
}
Model
类是通用的并且无法实现所描述的解决方案的问题。
我不想在每个子类上声明deserialize
方法。
因为可以使用装饰器“@Relationship”来解决问题吗?
答案 0 :(得分:0)
是的,有可能。有detailed example,它做了类似的事情,detailed description(俄语),它是如何工作的
简而言之,你应该做下一步:
在反序列化函数中迭代字段,并检查此字段的SomeUniqueDecoratorKey元数据是否为true。如果是,则获取字段类型构造函数并创建新实例。
var fieldTypeCtor = Reflect.getMetadata("design:type", target, fieldName);
var newInstance = new fieldTypeCtor(yourData);