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

TypeScript中类内部嵌套属性赋值时出现TypeError的问题求助

问题原因与解决方案

这是TypeScript/JavaScript里非常常见的新手坑——你在类A中仅仅声明了charge属性的类型为Charge,但并没有在创建A实例的时候初始化这个属性为Charge的实例。所以myData.charge默认是undefined,自然无法给它的子属性赋值,才会抛出TypeError: Cannot set property 'chargeType' of undefined这个错误。

下面给你几种可行的解决办法:


方法1:在类A的构造函数中初始化Charge实例

最规范的做法是在A的构造函数里提前创建Charge实例,这样每次创建A的对象时,charge属性就已经是一个可用的Charge对象了:

export class A { 
  public sourceReference: string; 
  public charge: Charge; 

  constructor() {
    // 初始化Charge实例
    this.charge = new Charge();
  }
}

这样你的create方法不需要做任何修改,直接赋值子属性就可以正常工作了。


方法2:在create方法中手动实例化Charge

如果不想修改类A的定义,可以在给charge的子属性赋值前,先创建一个Charge实例并赋值给myData.charge:

import { A, Charge } from "./a"; // 别忘了导入Charge类
public static create(payload) { 
  let myData = new A(); 
  myData.sourceReference = payload.sourceRef; 
  // 先实例化Charge再赋值
  myData.charge = new Charge();
  myData.charge.chargeType = payload.type; 
  myData.charge.chargeAccountNumber = payload.accountNumber; 
  myData.charge.chargeCurrency = payload.currency; 
  return JSON.stringify(myData); 
}

注意这里要确保已经导入了Charge类,否则会报错。


方法3:直接用对象字面量赋值(简化写法)

如果你的业务场景允许,也可以直接用对象字面量的方式创建符合A类型的对象,跳过类的实例化步骤(需要确保TypeScript的类型检查通过):

public static create(payload) { 
  let myData: A = {
    sourceReference: payload.sourceRef,
    charge: {
      chargeType: payload.type,
      chargeAccountNumber: payload.accountNumber,
      chargeCurrency: payload.currency
    }
  };
  return JSON.stringify(myData); 
}

这种写法更简洁,不需要调用new A()和new Charge(),但要注意如果类A或Charge有构造函数逻辑的话,这种方式不会执行那些逻辑,所以只适合纯数据类的场景。


补充说明

TypeScript的类型声明只是给编译器看的,不会在运行时自动创建对象实例。你声明public charge: Charge;只是告诉编译器“这个属性应该是Charge类型的对象”,但JavaScript运行时并不会帮你自动生成这个对象,所以默认值是undefined,这就是问题的核心所在。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 21:47:44