我使用以下代码集并获取带有本地存储的强类型项。
该集合按预期工作,并将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
}
}
答案 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