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

向TS自定义类型数组赋值报Cannot set properties of undefined错误

报错根因

报错是两个代码逻辑问题共同导致的:

  1. 你虽然声明了selectedApplicationFeatures是SelectedApplicationFeatures类型的数组,但初始化时给的是空数组[],数组内没有任何元素,索引0对应的位置是undefined,直接给undefined的id属性赋值必然触发类型错误。
  2. 计数变量j被定义在了if判断块内部,每次匹配到勾选的功能项时,j都会被重置为0,就算数组提前填充了元素,也会一直覆盖索引0位置的值,无法实现逐个追加选中项的效果。
修复代码

不需要单独维护计数索引,匹配到符合条件的项时,实例化模型后直接push进数组即可,从根源避免索引越界、变量重置问题:

// 赋值前先清空数组,避免重复追加历史脏数据
this.selectedApplicationFeatures = [];
for (let i = 0; i < _applicationFeatures.length; i++) {
  if (_applicationFeatures[i].featureChecked === true) {
    const currentFeature = new SelectedApplicationFeatures();
    currentFeature.id = _applicationFeatures[i].id;
    this.selectedApplicationFeatures.push(currentFeature);
  }
}

如果偏好更简洁的函数式写法,可以直接用数组原生方法实现,逻辑和上面完全一致:

this.selectedApplicationFeatures = _applicationFeatures
  .filter(item => item.featureChecked === true)
  .map(checkedItem => {
    const feature = new SelectedApplicationFeatures();
    feature.id = checkedItem.id;
    return feature;
  });
注意事项
  • 空数组初始化后不会自动填充类型对应的实例元素,不能直接通过索引访问不存在的位置给属性赋值,必须先在对应位置存入对象实例再操作属性
  • 用于累加计数的索引变量必须定义在循环外层,不能放在循环体、条件判断块内部,否则会被反复重置导致逻辑异常
  • 给自定义类数组赋值时,优先通过new实例化类再传值,不要直接塞普通对象字面量,避免后续给类新增原型方法时,数组内的元素无法继承对应方法

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 20:01:03