【问题标题】:TypeScript SerializationTypeScript 序列化
【发布时间】:2025-12-02 06:25:01
【问题描述】:

我无法将复杂的 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】:

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

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

【讨论】:

  • 感谢您的回答!这不是很令人满意,但我更清楚地了解问题所在。