Angular TypeScript中如何将字符串数组存入Accessright对象数组?
看起来你现在的核心问题是没把选中的entityName字符串正确转换成Accessright类型对象,反而直接把整个字符串数组往accessRights里塞,导致类型不匹配。另外之前直接给this.accessRights[i].entityName赋值的写法无效,大概率是因为accessRights数组没有预先初始化对应索引的Accessright对象。
正确的实现方式
你需要逐个为选中的页面创建Accessright对象,再把这些对象添加到accessRights数组中,而不是直接操作字符串数组。结合你给出的Accessright结构,代码可以这么写:
// 先清空原有的accessRights数组(如果需要重置的话) this.accessRights = []; // 循环遍历选中的页面,创建Accessright对象并添加到数组 this.selectedPages.forEach((page, index) => { // 创建符合Accessright类型的对象,填充必要属性 const newAccessRight: Accessright = { accessRightId: index, // 可根据需求设置ID,比如自增或后端返回值 entityName: page.entityName, entityAttribute: [], // 按你的示例是数组类型,默认设为空数组或对应值 // 若有其他必填属性,记得一并补上 }; this.accessRights.push(newAccessRight); });
为什么之前的写法会出错?
this.accessRights.push(this.selectedAccessRights)的问题:push方法是往数组里添加单个元素,你把整个String[]类型的数组作为一个元素传进去,自然会和Accessright类型不匹配,所以报错说String[]缺少Accessright的必要属性。this.accessRights[i].entityName = ...的问题:
如果accessRights数组在循环前没有初始化足够长度的Accessright对象,this.accessRights[i]很可能是undefined,直接赋值会报错;就算数组有长度,也可能因为没提前创建对象实例,只有最后一次循环的赋值生效。
补充说明
如果你的Accessright是类而非接口,需要用new关键字创建实例:
const newAccessRight = new Accessright(); newAccessRight.accessRightId = index; newAccessRight.entityName = page.entityName; newAccessRight.entityAttribute = []; this.accessRights.push(newAccessRight);
这样就能保证每个元素都是符合类型要求的Accessright对象,后端服务也能正确接收了。
内容的提问来源于stack exchange,提问作者Mason

