从本地存储解析后,类型断言无法正常工作

时间:2018-05-17 14:22:27

标签: angular typescript type-assertion

在我的角度项目中,我在本地存储中存储了一组数据点。

对于数据,我创建了一个类似的类:

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 属性没有关于它们的信息。

如何让类型断言起作用?

提前致谢!

1 个答案:

答案 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实例,因此类型断言现在可以按预期工作。