向TS自定义类型数组赋值报Cannot set properties of undefined错误
报错根因
报错是两个代码逻辑问题共同导致的:
- 你虽然声明了
selectedApplicationFeatures是SelectedApplicationFeatures类型的数组,但初始化时给的是空数组[],数组内没有任何元素,索引0对应的位置是undefined,直接给undefined的id属性赋值必然触发类型错误。 - 计数变量
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
相关产品推荐
相关产品推荐

