为JSON.stringify的value参数定义更严格的可序列化类型
可序列化值的TypeScript类型定义
要定义满足deepEqual(value, JSON.parse(JSON.stringify(value)))的类型,我们需要排除那些经过JSON序列化/反序列化后会改变或丢失的类型(比如Date序列化后变成ISO字符串,反序列化后不再是Date对象),同时只保留JSON原生支持且能完整还原的结构:
// 定义无法正确序列化还原的类型集合 type NonSerializable = Date | RegExp | Map<any, any> | Set<any> | Function | Symbol; // 基础可序列化原始类型 type SerializablePrimitive = string | number | boolean | null; // 可序列化对象:仅包含字符串键和可序列化值的普通对象 type SerializableObject = { [key: string]: SerializableValue }; // 可序列化数组:元素均为可序列化值 type SerializableArray = Array<SerializableValue>; // 最终的可序列化值类型 type SerializableValue = Exclude<SerializablePrimitive | SerializableObject | SerializableArray, NonSerializable>;
说明
- 这个类型会排除所有JSON处理后无法还原为原值的类型,确保序列化再反序列化后与原值深度相等。
- 静态类型无法检测循环引用,这类情况仍需在运行时处理,因为JSON.stringify遇到循环引用会直接抛出错误。
- 普通对象、数组以及JSON原生支持的原始类型都能被正确包含,符合需求。
内容的提问来源于stack exchange,提问作者Shruggie
相关产品推荐
相关产品推荐

