尝试使用该服务来使用本地存储。打字稿新手不足,因此需要泛型部分的帮助。因为我的要求很简单,所以不想使用第三方软件包。我可以将任何数据(例如字符串,数字,日期,布尔值或我的对象)放在本地存储中,也可以对其进行检索。我希望这项服务能为我处理所有事情。
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。
答案 0 :(得分:1)
在get
方法中,the type parameter T
is not known at runtime,因此您不能用它来决定如何对项目进行解码。您需要(1)向getItem
传递一个额外的参数来控制解码,或者(2)使用可以对所有T
进行相同解码的存储格式。例如,无论类型如何,都可以使用JSON.stringify
和JSON.parse
,但这不会保留日期。或者,您可以使用类似于JSON.stringify
和JSON.parse
但保留日期的第三方库。我有经验的库是Meteor的EJSON库; this似乎是EJSON库的独立程序包,您可以在非Meteor项目中使用它。