TypeScript序列化

问题描述 投票:1回答:1

我在将复杂的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的信息这么难?核心难点是什么?

json typescript serialization
1个回答
0
投票

只要看看generated code。 TypeScript类被编译为JavaScript类。运行时没有任何类型信息,因此您的问题不是关于TypeScript,而是about JavaScript。库使用装饰器,因为装饰器在运行时提供一些类型信息。

唯一的方法是使用静态分析。例如,使用标志Typedoc运行--json,解析输出并生成一些类型信息以用于序列化目的。

© www.soinside.com 2019 - 2024. All rights reserved.