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 = &lt;T&gt;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)。还有类来存储需要的电子邮件列表

本地存储中的 TypeScript 类型序列化/反序列化

如何强制 VSCode 使用本地安装的 TypeScript

从本地存储中保存和检索日期

Maven打包泛型相关错误,找不到对应的签名方法

如果用户登录 React 和 Typescript,则在刷新时重定向到仪表板