You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:47:03