我在将复杂的TypeScript对象存储到浏览器的存储中时遇到问题,因为它必须序列化为JSON字符串。
class ComplexObject {
constructor(
public date: Date,
public child: SimpleObject,
) {}
getContent() {
return this.child.content
}
}
class SimpleObject {
constructor(
public content: string,
) {}
}
虽然const store = JSON.stringify(new ComplexObject(new Date(), new SimpleObject('test')))
生产JSON我很好,const restored = JSON.parse(store)
将是一个完全不同的对象。
restored.date
是一个字符串,而不是Date
restored.getContent()
产生类型错误,因为该函数不再存在于对象中我已经尝试了一些序列化库,例如cerialize,我已经开始工作了。但是我发现的所有库都需要显式标记属性,或者至少需要带有装饰器的类,例如@Serialize()
。
这个样板令我烦恼,因为我相信TypeScript已经拥有了将对象序列化和正确反序列化为JSON所需的所有信息。我必须手动添加的每一行都增加了愚蠢错误的可能性,而且显然不是很有趣。
是否存在不需要手动装饰器的库,只需要使用TypeScript对象,将它们序列化为JSON字符串,然后提供从该字符串恢复正确对象的方法?
如果不是,为什么使用TypeScript的信息这么难?核心难点是什么?
只要看看generated code。 TypeScript类被编译为JavaScript类。运行时没有任何类型信息,因此您的问题不是关于TypeScript,而是about JavaScript。库使用装饰器,因为装饰器在运行时提供一些类型信息。
唯一的方法是使用静态分析。例如,使用标志Typedoc运行--json
,解析输出并生成一些类型信息以用于序列化目的。