Typescript - 使用泛型进行本地存储

The*_*t11 8 generics local-storage typescript

我正在使用以下代码集并使用本地存储获取强类型项目。

该集按预期工作并将 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
    }
}
Run Code Online (Sandbox Code Playgroud)

tos*_*skv 5

这是因为 Typescript 没有类型转换。

它有类型断言。

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

如果您想以类型保存方式完成类似的操作,您可能必须实现一种标准方法来序列化和反序列化您的类。就像可以将类实例的状态传输为字符串的 Serialized 接口以及从序列化状态创建该类型的新对象的方法一样。


The*_*t11 3

像这样进行转换更安全JSON.parse(data) as T,因为如果转换不起作用(而不是异常),您将得到 null