TypeScript嵌套方法JSON工具类实现问题求助
解决JSON工具类链式调用的问题
让我们一步步修复你的代码,满足链式调用、类型安全以及方法访问控制的需求:
核心问题分析
你的现有代码存在几个关键问题:
- 静态成员共享数据:
static data会被所有parse调用共享,导致并发调用时数据污染 - parse返回值错误:返回的是原始json而非类实例,无法支持链式调用
- extract参数类型错误:传入的
entity是类型而非构造函数,无法用new创建实例 - 方法访问控制:
extract作为静态方法可以直接调用,不符合你的需求
完整解决方案代码
class Department { id: number = 0; constructor() { } } class JSONMethods<U> { // 用实例成员存储解析后的数据,避免静态共享带来的冲突 private data: U; // 私有构造函数,确保只能通过parse静态方法创建实例 private constructor(data: U) { this.data = data; } /** * 解析JSON字符串或直接接收数据,返回兼具实例方法和解析结果的对象 */ static parse<U>(json: string | U): JSONMethods<U> & U { let parsedData: U; if (typeof json === 'string') { // 若需支持非标准JSON(如单引号),可添加预处理逻辑: // parsedData = JSON.parse(json.replace(/'/g, '"')) as U; parsedData = JSON.parse(json) as U; } else { parsedData = json; } // 返回交叉类型,既可以调用实例方法,又可以直接当作解析结果使用 return new JSONMethods(parsedData) as JSONMethods<U> & U; } /** * 格式化数据(示例直接返回原数据,可根据需求扩展缩进、类型转换等逻辑) */ format(): U { return this.data; } /** * 将解析后的数据映射到指定实体类实例 * @param EntityConstructor 目标实体的构造函数 */ extract<T>(EntityConstructor: new () => T): T { const entityInstance = new EntityConstructor(); return Object.assign(entityInstance, this.data); } }
代码验证与使用示例
1. 直接获取解析结果
const rawResult = JSONMethods.parse("{\"name\": \"hello\"}"); console.log(rawResult); // { name: 'hello' } console.log(rawResult.name); // 'hello'
2. 链式调用format方法
const formattedResult = JSONMethods.parse("{\"name\": \"hello\"}").format(); console.log(formattedResult); // { name: 'hello' }
3. 链式调用extract方法
const department = JSONMethods.parse("{\"name\": \"hello\"}").extract(Department); console.log(department); // Department { id: 0, name: 'hello' } console.log(department instanceof Department); // true
4. 禁止直接调用extract(符合需求)
// 编译错误:Property 'extract' does not exist on type 'typeof JSONMethods' JSONMethods.extract(Department);
关键修改点解释
- 私有构造函数:限制实例只能通过
parse方法创建,避免外部随意实例化 - 交叉类型返回值:
JSONMethods<U> & U让返回对象同时具备实例方法和解析结果的特性,完美支持两种使用方式 - 构造函数类型参数:
new () => T明确要求传入可实例化的类构造函数,解决了"Cannot use 'new' with an expression whose type lacks a call or construct signature"的编译错误 - 实例成员存储数据:每个
parse调用都有独立的数据副本,避免多场景调用时的数据冲突
内容的提问来源于stack exchange,提问作者Premkumar
相关产品推荐
相关产品推荐

