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

TypeScript方法优化问题:精简renameJson后编译报错求解答

问题分析与修复

你遇到的是箭头函数语法的常见坑,咱们一步步拆解问题出在哪:

错误原因

你的renameJson2里,reduce的回调箭头函数直接写了{ ...s, [...] : ... },但JavaScript/TypeScript会把箭头函数里的第一个{当成函数体的开始标记,而不是对象字面量的开头。这就导致里面的对象展开语法...s和计算属性语法[...]都变成了无效的语句,编译器自然会报错。

另外,你用花括号包裹内容后,也没有写return语句——如果用花括号定义箭头函数的函数体,必须显式return要返回的对象;如果不想写return,就得用括号把对象字面量包起来,明确告诉编译器这是要返回的对象,不是函数体。

修复后的代码

方案一:用括号包裹对象字面量(无需显式return)

public renameJson2(json: any): any {
  return Object.keys(json).reduce(
    (s, item) => ({
      ...s,
      [this.isUpperCase(item.charAt(1)) ? item.toLowerCase() : this.getFirstLetterToLowerCase(item)]: this.getTransform(json[item])
    }), 
    {}
  );
}

方案二:显式添加return语句

如果你习惯用花括号包裹函数体,也可以明确加上return:

public renameJson2(json: any): any {
  return Object.keys(json).reduce(
    (s, item) => {
      return {
        ...s,
        [this.isUpperCase(item.charAt(1)) ? item.toLowerCase() : this.getFirstLetterToLowerCase(item)]: this.getTransform(json[item])
      };
    }, 
    {}
  );
}

额外可读性优化建议

你的优化思路非常棒(提取重复逻辑、合并对象操作),可以再进一步把属性名的计算逻辑抽成变量,让代码更清晰:

public renameJson2(json: any): any {
  return Object.keys(json).reduce((s, item) => {
    // 把属性名计算逻辑单独拎出来,可读性更高
    const targetPropName = this.isUpperCase(item.charAt(1)) 
      ? item.toLowerCase() 
      : this.getFirstLetterToLowerCase(item);
    return {
      ...s,
      [targetPropName]: this.getTransform(json[item])
    };
  }, {});
}

内容的提问来源于stack exchange,提问作者reactpromiseprob2

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:56:48