【问题标题】:Typescript - using generics to for localstorageTypescript - 使用泛型进行本地存储
【发布时间】: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
    }
}

【问题讨论】:

    标签: generics typescript local-storage


    【解决方案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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-21
        • 2020-11-03
        • 2011-02-07
        • 1970-01-01
        • 2021-08-27
        • 2021-09-25
        • 1970-01-01
        • 2018-05-27
        相关资源
        最近更新 更多