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

