在我的角度项目中,我在本地存储中存储了一组数据点。
对于数据,我创建了一个类似的类:
export class Datapoint {
id: number;
name: string;
// ... some more properties.
constructor(){
}
public getDescription() {
// ... logic
}
// ... more functions
}
现在我从本地存储中检索数组并从字符串中解析回来。
const dpList = JSON.parse(localStorage.getItem('datapoints'));
因为' dpList'属于'对象'我为我的类型做了一个类型断言' Datapoint'。
const datapoints: Datapoint[] = [];
public someFunction(): Datapoint[] {
// Get the stringified objects from the local storage.
const dpList = JSON.parse(localStorage.getItem('datapoints'));
// Iterate through the array and push to this.datapoints.
dpList.forEach(dp => {
const asserted_dp: Datapoint = (dp as Datapoint);
this.datapoints.push(asserted_dp);
});
}
但是asserted_dp是在Object类型断言之后,而不是像我预期的那样Datapoint。所以我无法访问Datapoint类型的函数,因为 proto 属性没有关于它们的信息。
如何让类型断言起作用?
提前致谢!
答案 0 :(得分:1)
了解问题
本地存储只存储字符串。虽然您可能已将Datapoint对象字符串化以进行存储,但当您JSON.parse
字符串时,它不会返回Datapoint
的实例,而是会为您提供正常的javascript Object
类型。这很重要,因为您的对象不再使用Datapoint
方法,例如getDescription
,因此您不能只使用该类型。
潜在解决方案
我建议创建一个从序列化字符串重构Datapoint
实例的加载器。我不知道你通常如何构建你的数据点,但我会在这里给出一个简单的例子
function loadDatapoints(): Datapoint[] {
var dp_objects: any = JSON.parse(localStorage.getItem('datapoints'));
var points: Datapoint[] = [];
for (var i: number = 0; i < dp_objects.length; i++) {
var point: Datapoint = new Datapoint();
// However you normally construct Datapoints...
points.push(point);
}
return points;
}
通过这种方式,您实际上正在使用Datapoint实例,因此类型断言现在可以按预期工作。