Утверждение типа не работает после анализа из локального хранилища - PullRequest
0 голосов
/ 17 мая 2018

В моем угловом проекте я сохранил массив точек данных в локальном хранилище.

Для данных я создал такой класс:

export class Datapoint {
  id: number;
  name: string;
  // ... some more properties.

  constructor(){
  }

  public getDescription() {
    // ... logic
  }

  // ... more functions
}

Теперь я извлекаю массив излокальное хранилище и анализирует его обратно из строки.

const dpList = JSON.parse(localStorage.getItem('datapoints'));

Поскольку 'dpList' имеет тип 'Object', я делаю утверждение типа для моего типа '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 голосов
/ 17 мая 2018

Понимание проблемы

Локальное хранилище хранит только строки. В то время как вы, возможно, структурировали свои объекты 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 и, следовательно, утверждение типа теперь работает как положено.

...