我有以下json:
{
"AssetId": "Asset1",
"Currency": "USD",
"Rating": "BBB",
"Dur": 0.557519237
}
和班级:
export class Constituent {
AssetId?: string;
Currency?: string;
Rating?: string;
Dur?: number;
public get maturityBucket(): string {
const dur = this.Dur || 0;
if (dur < 0.5) {
return '0-6m';
}
if (dur < 1) {
return '6m-1y';
}
if (dur < 2) {
return '1y-2y';
}
if (dur < 5) {
return '2y-5y';
} else {
return '5y+';
}
}
}
然而,当我像这样阅读JSON时:
loadConstituentData(): void {
const url = './src/data/assets.json';
this.http.get(url)
.subscribe(response => {
this.data.next(<Constituent[]>response.json());
}, this.handleError);
}
maturityBucket
只读属性消失。
我该如何解决这个问题?
以下是代码的Plunker:https://plnkr.co/edit/3oRl9zIlG23jBUvUqaw6?p=preview
答案 0 :(得分:0)
当您尝试将对象强制转换为特定的类或接口时,您不会更改此对象,您只需告诉Typescript编译器该对象具有特定类型以进行进一步的类型检查。在这种情况下,您确实拥有对象的所有属性,但没有方法(getter属性实际上是方法),所以这样做只会误导编译器和你自己。要使此readonly属性工作,您必须将其添加到对象。
Yo可以通过创建新的Constituent实例并从对象中分配属性来实现所需的行为。例如:
export class Constituent {
AssetId?: string;
Currency?: string;
Rating?: string;
Dur?: number;
static createFromJsonObject(jsonObject: any): Constituent {
let constituent = new Constituent();
return Object.assign(constituent, jsonObject);
}
...
}
用法是:
this.http.get(url)
.subscribe(response => {
this.data.next(response.json().map(item => Constituent.createFromJsonObject(item)));
}, this.handleError);