Json localstorage中的类型脚本类型序列化/反序列化

Json localstorage中的类型脚本类型序列化/反序列化,json,typescript,local-storage,Json,Typescript,Local Storage,我有一个打字脚本应用程序。我使用localstorage for development来存储我的对象,在反序列化时遇到了问题 我有一个MeetingModel类型的对象会议: export interface MeetingModel { date: moment.Moment; // from the library momentjs } 我使用JSON.stringify(meeting)将此对象存储在本地存储中 我假设stringify调用moment.toJson(),它返回

我有一个打字脚本应用程序。我使用localstorage for development来存储我的对象,在反序列化时遇到了问题

我有一个MeetingModel类型的对象会议:

export interface MeetingModel {
    date: moment.Moment; // from the library momentjs
}
我使用
JSON.stringify(meeting)
将此对象存储在本地存储中

我假设stringify调用moment.toJson(),它返回一个iso字符串,因此存储的值是:
{“date”:“2016-12-26T15:03:54.586Z”}

检索此对象时,我执行以下操作:

const stored = window.localStorage.getItem("meeting");
const meeting: MeetingModel = JSON.parse(stored);
问题是:meeting.date包含一个字符串而不是一个时刻

所以,首先我想知道为什么TypeScript会让这种情况发生?为什么我可以指定一个字符串值而不是一个时刻,并且编译器同意

其次,如何将对象从普通JSON对象(也称为字符串)恢复为Typescript类型

我当然可以创建一个工厂,但当我的对象数据库长大后,做所有这些工作将是一件痛苦的事

也许有一种解决方案可以更好地存储在本地存储中

谢谢

1)打字脚本是可选的。这意味着有办法绕过严格的类型系统。
any
类型允许您进行动态键入。如果你知道自己在做什么,这会非常有用,但当然你也可以射中自己的脚

此代码将编译:

var x: string = <any> 1;
var x:string=1;
这里发生的事情是,
编号
1被转换为
any
,这意味着TypeScript将假定您作为开发人员知道它是什么以及如何使用它。由于
any
类型随后被分配给
string
TypeScript,因此即使您在运行时可能会出错,就像编写JavaScript时出错一样,它也完全可以使用

当然这是故意的。TypeScript类型仅在编译时存在。TypeScript不知道您在
JSON.parse中输入了什么类型的字符串,因为输入字符串只在运行时存在,可以是任何内容。因此,
any
类型。TypeScript确实提供了所谓的类型保护。类型保护是在编译时和运行时都能理解的代码,但这超出了您的问题范围(如果您感兴趣,可以用谷歌搜索)

2) 序列化和反序列化数据通常不像调用
JSON.stringify
JSON.parse
那么简单。大多数类型信息都会丢失到JSON中,并且在运行时存储对象(内存中)的方式通常与存储对象以进行传输或存储(内存、磁盘或任何其他介质)的方式非常不同。例如,在运行时,您可能需要查找表、用户/会话状态、专用字段、特定于库的属性,而在存储中,您可能需要版本号、时间戳、元数据、不同类型的规范化等。您可以
JSON.stringify
JavaScript land中的任何内容,但这并不意味着这是一个好主意。您可能需要设计实际存储数据的方式。例如,一个iso字符串看起来很漂亮,但需要很多字节。如果你有几个并不重要,但当你传输数百万秒,你可能想考虑另一种格式。 我建议您为要保存的对象定义接口,并在模型对象上创建一个
.toJson
方法,该方法将返回DTO(数据传输对象),您可以简单地用
JSON.stringify
进行序列化。然后在返回的过程中,您将
JSON.parse
any
输出转换为DTO,然后使用您创建的工厂函数或构造函数将其转换回您的模型。这看起来像是很多样板文件,但根据我的经验,这是完全值得的,因为现在您可以控制存储的内容,这使您能够灵活地更改模型,而不会出现反序列化问题

祝你好运

1)TypeScript是可选类型。这意味着有办法绕过严格的类型系统。
any
类型允许您进行动态键入。如果你知道自己在做什么,这会非常有用,但当然你也可以射中自己的脚

此代码将编译:

var x: string = <any> 1;
var x:string=1;
这里发生的事情是,
编号
1被转换为
any
,这意味着TypeScript将假定您作为开发人员知道它是什么以及如何使用它。由于
any
类型随后被分配给
string
TypeScript,因此即使您在运行时可能会出错,就像编写JavaScript时出错一样,它也完全可以使用

当然这是故意的。TypeScript类型仅在编译时存在。TypeScript不知道您在
JSON.parse中输入了什么类型的字符串,因为输入字符串只在运行时存在,可以是任何内容。因此,
any
类型。TypeScript确实提供了所谓的类型保护。类型保护是在编译时和运行时都能理解的代码,但这超出了您的问题范围(如果您感兴趣,可以用谷歌搜索)

2) 序列化和反序列化数据通常不像调用
JSON.stringify
JSON.parse
那么简单。大多数类型信息都会丢失到JSON中,并且在运行时存储对象(内存中)的方式通常与存储对象以进行传输或存储(内存、磁盘或任何其他介质)的方式非常不同。例如,在运行时,您可能需要查找表、用户/会话状态、专用字段、特定于库的属性,而在存储中,您可能需要版本号、时间戳、元数据、不同类型的规范化等。您可以
JSON.string