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

报错TypeError: Cannot read property '' of undefined,酒店添加表单开发求助

问题排查与修复方案

咱们来拆解你遇到的ERROR TypeError: Cannot read property '' of undefined错误,核心原因是addHotel函数里创建Hotel实例的代码存在两处关键问题:

1. 错误的地址实例化逻辑

你当前的代码里,给Hotel构造函数传地址参数时误用了逗号运算符:

let newHotel = new Hotel(hotel["name"], (hotel.address["country"], hotel.address["town"], hotel.address["street"]));

逗号运算符的特性是依次执行多个表达式,最终只返回最后一个表达式的值——也就是说你这里实际只传了hotel.address["street"]这个字符串,但Hotel类要求第二个参数是Address类型的实例,这不仅类型完全不匹配,还根本没有创建合法的Address对象。

2. hotel.address未初始化的风险

如果表单绑定环节没有提前给hotel.address初始化一个空的Address对象(比如用户还没填写地址,或者控件绑定逻辑出错),hotel.address就会是undefined,这时候你去访问hotel.address["country"]就会触发"Cannot read property 'country' of undefined"的错误(你看到的''大概率是错误提示的显示占位)。


修复后的代码示例

第一步:优化Address类(可选但更规范)

给Address类添加构造函数,方便直接传入参数创建实例:

export class Address {
  constructor(
    public country: string,
    public town: string,
    public street: string
  ) {}
}

如果不想修改Address类,也可以用对象字面量+类型断言的方式创建地址对象。

第二步:修正addHotel函数逻辑

addHotel(hotel: any, address: any) {
  if (this.form.valid) {
    // 先检查地址是否存在,避免undefined报错
    if (!hotel.address) {
      console.error("地址信息未正确初始化");
      return;
    }
    
    // 正确创建Address实例
    const newAddress = new Address(
      hotel.address.country,
      hotel.address.town,
      hotel.address.street
    );
    
    // 创建合法的Hotel实例
    let newHotel = new Hotel(hotel.name, newAddress);
    
    // 后续的保存/提交逻辑...
  }
}

如果不想修改Address构造函数,也可以这样创建地址对象:

const newAddress: Address = {
  country: hotel.address.country,
  town: hotel.address.town,
  street: hotel.address.street
};

额外优化建议

  • 尽量避免使用any类型,给hotel和address参数指定Hotel、Address类型,让TypeScript在编译阶段就帮你发现类型错误,不用等到运行时踩坑。
  • 在组件初始化时提前给hotel赋值一个空实例:hotel = new Hotel('', new Address('', '', '')),确保hotel.address始终是一个合法的Address对象,从根源避免undefined报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:08:28