TypeScript如何通过for循环修改对象属性并解决赋值语法报错
错误原因
- 点语法无法识别动态变量:你写
searchBody.constrain.name.key时,TypeScript会将key识别为固定的属性名,而非你循环中定义的变量,同时你的searchFilterObject接口中不存在key这个属性,直接触发类型报错。 - 类型不匹配:
for...in循环得到的key默认是string类型,直接用作对象索引时,TypeScript无法确认该key是否属于目标对象的合法属性,会触发隐式any类型报错。 - 业务逻辑不匹配:你当前遍历的是
searchBody.type.name的属性(name/last_name/email等),但searchBody.constrain.name的合法属性是contain/equal_to等,两者属性完全不重叠,就算语法修正后也无法正常赋值。
修正方案
首先明确你的业务目标,分两种场景处理:
场景1:需要更新searchBody.type.name下对应序号的属性为true
// 先提取合法的属性列表,加类型断言告诉TS这些key都是searchByObject的合法属性 const typeKeys = Object.keys(searchBody.type.name) as Array<keyof searchByObject>; for (let n = 0; n < typeKeys.length; n++) { if (this.searchBy === n.toString()) { // 动态属性访问用方括号语法 searchBody.type.name[typeKeys[n]] = true; } }
场景2:需要更新searchBody.constrain.name下对应序号的匹配规则为true
const constrainKeys = Object.keys(searchBody.constrain.name) as Array<keyof searchFilterObject>; for (let n = 0; n < constrainKeys.length; n++) { if (this.searchBy === n.toString()) { searchBody.constrain.name[constrainKeys[n]] = true; } }
额外注意
你原来的代码中searchBy: string = ''缺少变量声明关键字,如果是局部变量请补充let/const,如果是类属性请在类定义中声明类型即可。
内容的提问来源于stack exchange,提问作者WhiteAB
相关产品推荐
相关产品推荐

