Typescript - 使用泛型进行本地存储
Posted
技术标签:
【中文标题】Typescript - 使用泛型进行本地存储【英文标题】:Typescript - using generics to for localstorage 【发布时间】:2017-09-27 12:05:21 【问题描述】:我正在使用以下代码集并使用本地存储获取强类型项目。
该集合按预期工作并将 JSON 放入本地存储。
但是,当取出相同的项目时,转换为泛型类型似乎不起作用。它不会引发异常,只是返回一个 JSON 字符串,而不是所需的类型化对象。
export class StorageService
constructor()
setItem<T>(key: string, item: T): void
localStorage.setItem(key, JSON.stringify(item));
getItem<T>(key: string): T
let data: any = localStorage.getItem(key);
if (!data) return null;
let obj: T;
try
obj = <T>JSON.parse(data);
catch (error)
obj = null;
return obj
【问题讨论】:
【参考方案1】:那是因为 typescript 没有类型转换。
它有类型断言。
obj = <T>JSON.parse(data);
的作用是告诉编译器无论 JSON.parse 返回什么都是 T 类型。这一切都在编译时,运行时什么都没有。
如果您想以类型保存的方式完成类似的操作,您可能必须实现一种标准方法来序列化和反序列化您的类。就像可以将类实例的状态转换为字符串的 Serializable 接口,以及从序列化状态创建该类型的新对象的方法。
【讨论】:
【参考方案2】:您不能这样做,因为 JSON.parse() 返回一个新的纯 javascript 对象,由字符串输入表示。如果您将一个类的实例(例如 Person)传递给您的 setItem() 方法,那么您的 JSON.parse() 在 getItem() 方法中返回的值将不是 Person 的实例,而是一个具有在 setItem() 方法中序列化的所有属性的纯 JavaScript 项目。但是,您应该能够转换为接口,如果您正在构建某种强类型值持久性模块,这可能是您想要的。
查看这个问题和答案:How do I cast a JSON object to a typescript class
【讨论】:
以上是关于Typescript - 使用泛型进行本地存储的主要内容,如果未能解决你的问题,请参考以下文章
typescript TypeScript上的简单帮助程序模块,用于在浏览器中使用本地存储(HTML5)。还有类来存储需要的电子邮件列表