在TypeScript中将泛型与LocalStorage Service一起使用-Angular 6

时间:2018-08-16 18:35:36

标签: typescript angular6

尝试使用该服务来使用本地存储。打字稿新手不足,因此需要泛型部分的帮助。因为我的要求很简单,所以不想使用第三方软件包。我可以将任何数据(例如字符串,数字,日期,布尔值或我的对象)放在本地存储中,也可以对其进行检索。我希望这项服务能为我处理所有事情。

import { Injectable } from "@angular/core";

@Injectable({
  providedIn: 'root'
})

export class LocalStorageService {
  constructor() { }

  clear() {
    localStorage.clear();
  }

  removeItem(key: string) {
    localStorage.removeItem(key);
  }

  setItem<T>(key: string, data: T): boolean {
    try {
      if (typeof data === "string") {
        localStorage.setItem(key, data)
      }
      else if (typeof data === "number" || typeof data === "boolean" || typeof data === "date") {
        localStorage.setItem(key, data.toString())
      }
      else {
        //its my custom object
        localStorage.setItem(key, JSON.stringify(data));
      }
      return true;
    }
    catch (e) {
      return false;
    }
  }

  getItem<T>(key: string) : T {
    try {
      let data: object = null;
      if (typeof T === "string" || typeof T === "number" || typeof T === "boolean" || typeof T === "date") {
        data = <T>localStorage.getItem(key);
      }
      else {
        data = <T>JSON.parse(localStorage.getItem(key));
      }

      if (data && data is T) {
        return <T>data;
      }

      return null;

    } catch (e) {
      console.log('Error getting data from localStorage', e);
      return null;
    }
  }
}

在set方法中,typeof data === "date"导致=== cannot be applied to strings, boolean, number等。它仅在日期部分。

在get方法中,如何检查T的类型,然后返回正确的T。

1 个答案:

答案 0 :(得分:1)

get方法中,the type parameter T is not known at runtime,因此您不能用它来决定如何对项目进行解码。您需要(1)向getItem传递一个额外的参数来控制解码,或者(2)使用可以对所有T进行相同解码的存储格式。例如,无论类型如何,都可以使用JSON.stringifyJSON.parse,但这不会保留日期。或者,您可以使用类似于JSON.stringifyJSON.parse但保留日期的第三方库。我有经验的库是Meteor的EJSON库; this似乎是EJSON库的独立程序包,您可以在非Meteor项目中使用它。