SuperJSON注册机制完全指南如何优雅处理Class、Symbol和自定义类型【免费下载链接】superjsonSafely serialize JavaScript expressions to a superset of JSON, which includes Dates, BigInts, and more.项目地址: https://gitcode.com/gh_mirrors/su/superjsonSuperJSON是一款强大的JavaScript序列化库它扩展了标准JSON的功能支持序列化Date、BigInt、Map、Set等内置类型更重要的是它提供了完整的注册机制让你能够优雅地处理自定义Class、Symbol和复杂数据类型。在前100个词中我们深入探讨SuperJSON的核心注册功能包括class注册、symbol注册和custom transformer注册这些功能让开发者能够安全地序列化任何JavaScript表达式。 为什么需要SuperJSON注册机制传统JSON.stringify()在处理复杂JavaScript对象时存在严重限制——它无法正确处理Date、Map、Set、BigInt等类型更不用说自定义类实例了。SuperJSON通过其智能的注册机制解决了这些问题。SuperJSON的注册系统位于src/index.ts的核心实现中提供了三种主要的注册方式registerClass()、registerSymbol()和registerCustom()。这些机制共同构成了SuperJSON强大的类型扩展能力。️ Class注册让自定义类可序列化Class注册是SuperJSON最常用的功能之一。通过registerClass()方法你可以让任何自定义类的实例在序列化和反序列化过程中保持其类型完整性。基本Class注册示例import SuperJSON from superjson; class User { constructor(name, email) { this.name name; this.email email; } } // 注册User类 SuperJSON.registerClass(User); const user new User(张三, zhangsanexample.com); const serialized SuperJSON.stringify(user); const deserialized SuperJSON.parse(serialized); console.log(deserialized instanceof User); // true!高级Class注册选项SuperJSON还支持更精细的控制比如指定允许序列化的属性class SecureUser { constructor(username, password, token) { this.username username; this.password password; // 敏感信息 this.token token; // 敏感信息 } } // 只允许序列化username属性 SuperJSON.registerClass(SecureUser, { identifier: SecureUser, allowProps: [username] });在src/class-registry.ts中ClassRegistry类负责管理所有已注册的类确保每个类都有唯一的标识符。 Symbol注册保持Symbol的唯一性JavaScript中的Symbol是唯一的但标准JSON序列化会丢失这一特性。SuperJSON的registerSymbol()方法解决了这个问题。Symbol注册实战import SuperJSON from superjson; const PRIVATE_KEY Symbol(privateKey); const PUBLIC_KEY Symbol(publicKey); // 注册Symbol SuperJSON.registerSymbol(PRIVATE_KEY, privateKey); SuperJSON.registerSymbol(PUBLIC_KEY, publicKey); const data { [PRIVATE_KEY]: secret123, [PUBLIC_KEY]: public456 }; const serialized SuperJSON.stringify(data); const deserialized SuperJSON.parse(serialized); // Symbol保持唯一性 console.log(Object.getOwnPropertySymbols(deserialized)[0] PRIVATE_KEY); // true️ 自定义转换器处理任意数据类型对于内置类型和自定义类之外的数据类型SuperJSON提供了最灵活的解决方案——自定义转换器Custom Transformer。Decimal.js集成示例import SuperJSON from superjson; import { Decimal } from decimal.js; // 注册Decimal.js支持 SuperJSON.registerCustom( { isApplicable: (v) Decimal.isDecimal(v), serialize: (v) v.toJSON(), deserialize: (v) new Decimal(v), }, decimal.js ); const price new Decimal(99.99); const serialized SuperJSON.stringify({ price }); const deserialized SuperJSON.parse(serialized); console.log(deserialized.price instanceof Decimal); // true console.log(deserialized.price.toString()); // 99.99自定义转换器架构在src/custom-transformer-registry.ts中CustomTransformerRegistry负责管理所有自定义转换器。每个转换器需要实现三个关键方法isApplicable()- 判断是否适用于特定值serialize()- 将值转换为JSON兼容格式deserialize()- 从JSON格式恢复原始值 注册机制的内部工作原理SuperJSON的注册系统基于一个高效的双向索引KV存储位于src/double-indexed-kv.ts。这个设计确保了快速查找通过标识符快速找到对应的类或转换器避免重复相同的类或Symbol不会被重复注册类型安全TypeScript类型支持确保编译时安全注册表的核心实现src/registry.ts中的Registry类是所有注册机制的基础export class RegistryT { private kv new DoubleIndexedKVstring, T(); constructor(private readonly generateIdentifier: (v: T) string) {} register(value: T, identifier?: string): void { if (this.kv.getByValue(value)) { return; // 避免重复注册 } if (!identifier) { identifier this.generateIdentifier(value); } this.kv.set(identifier, value); } } 实际应用场景场景1Next.js数据序列化Next.js的getServerSideProps和getInitialProps方法有严格的序列化限制。SuperJSON的注册机制完美解决了这个问题// pages/_app.tsx import SuperJSON from superjson; import { Decimal } from decimal.js; // 在应用启动时注册所有需要的类型 SuperJSON.registerCustom( { isApplicable: (v) Decimal.isDecimal(v), serialize: (v) v.toJSON(), deserialize: (v) new Decimal(v), }, decimal.js ); class User { // ... 用户类定义 } SuperJSON.registerClass(User);场景2API数据传输在前后端分离的架构中SuperJSON确保复杂数据类型在API调用中保持完整// 前端 const response await fetch(/api/data); const data await response.json(); const deserialized SuperJSON.deserialize(data); // 后端 app.get(/api/data, (req, res) { const complexData { date: new Date(), set: new Set([1, 2, 3]), map: new Map([[key, value]]), user: new User(张三) }; res.json(SuperJSON.serialize(complexData)); }); 最佳实践指南尽早注册在应用启动时就注册所有需要的类型使用唯一标识符为自定义类型提供明确的标识符处理循环引用SuperJSON支持循环引用检测性能优化对于大型对象使用inPlace: true选项错误处理注册Error类并指定允许的属性// 错误处理最佳实践 class CustomError extends Error { constructor(message, code) { super(message); this.code code; this.timestamp new Date(); } } SuperJSON.registerClass(CustomError, { allowProps: [message, code, timestamp] }); SuperJSON.allowErrorProps(code, timestamp); 总结SuperJSON的注册机制为JavaScript序列化提供了前所未有的灵活性。通过registerClass()、registerSymbol()和registerCustom()三个核心方法开发者可以✅ 安全序列化自定义类实例✅ 保持Symbol的唯一性✅ 支持任意第三方库的数据类型✅ 在Next.js等框架中无缝使用复杂数据类型✅ 确保前后端数据一致性无论是处理财务计算中的Decimal类型还是维护应用状态中的复杂对象图SuperJSON的注册机制都能提供可靠、类型安全的解决方案。开始使用SuperJSON让你的JavaScript序列化体验达到新的高度【免费下载链接】superjsonSafely serialize JavaScript expressions to a superset of JSON, which includes Dates, BigInts, and more.项目地址: https://gitcode.com/gh_mirrors/su/superjson创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考