打字稿 - 使用泛型进行本地存储

时间:2017-04-29 12:57:59

标签: generics typescript local-storage

我使用以下代码集并获取带有本地存储的强类型项。

该集合按预期工作,并将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
    }
}

2 个答案:

答案 0 :(得分:3)

那是因为打字稿没有类型转换。

它有类型断言。

obj = <T>JSON.parse(data);做的是告诉编译器,无论 JSON.parse 返回什么,它的类型为 T 。所有在编译时都没有在运行时。

如果您希望以类型保存方式完成此类操作,则可能需要实施标准方法来序列化和反序列化您的类。就像可以将类实例的状态转换为字符串的Serializable接口和从序列化状态创建该类型的新对象的方法。

答案 1 :(得分:0)

你不能这样做,因为JSON.parse()返回一个新的纯JavaScript对象,由字符串输入表示。如果你将一个类的实例(例如Person)传递给你的setItem()方法,那么你的getItem()方法中的JSON.parse()返回的值将不是Person的实例,而是一个纯JavaScript项目,包含在setItem()方法中序列化的所有属性。但是,您应该能够转换为接口,如果您正在构建某种强类型值持久性模块,那么可能就是您想要的接口。

看到这个问题&amp;回答:How do I cast a JSON object to a typescript class