Typescript/Angular中如何将字符串转换为对应的类实例变量?
问题解决方案
你要通过字符串匹配对应的类实例属性,直接用this[属性名字符串]的形式即可,之前报错是因为你错误地写为this.objectToRead,该写法是查找类里名为objectToRead的属性,而非把objectToRead变量的值作为属性名查找。
同时你原代码里拼接逻辑多写了messageToHandle,会把整个对象转为[object Object]拼入结果,需要删掉。以下是两种可行实现方案:
方案1:直接索引访问(写法简单)
handleAlertBody(messageToHandle):string{ let messageBody: string = ''; if(messageToHandle['alertMessageObject0']){ // 加as keyof this是为了兼容TypeScript类型检查,避免索引签名报错 const objectToRead = messageToHandle['alertMessageObject0'] as keyof this; const objectKey = messageToHandle['alertMessageKey0']; // 以变量值为属性名访问实例属性 const insertion = this[objectToRead][objectKey]; // 去掉多余的messageToHandle拼接 messageBody += messageToHandle['alertMessagePreObject0'] + insertion + messageToHandle['alertMessagePostObject0']; } else { messageBody = 'no object provided'; } return messageBody; }
方案2:白名单映射(安全性更高)
如果要避免外部传入非法属性名读取类的内部敏感属性,可以提前定义允许访问的属性映射,可控性更强,更推荐生产环境使用:
// 类内部提前定义允许读取的属性白名单 private allowedReadMap = { examples: this.examples } handleAlertBody(messageToHandle):string{ let messageBody: string = ''; const targetKey = messageToHandle['alertMessageObject0']; // 先校验传入的属性名是否在白名单内 if(targetKey && this.allowedReadMap[targetKey]){ const targetObject = this.allowedReadMap[targetKey]; const insertionKey = messageToHandle['alertMessageKey0']; const insertion = targetObject[insertionKey]; messageBody += messageToHandle['alertMessagePreObject0'] + insertion + messageToHandle['alertMessagePostObject0']; } else { messageBody = 'no object provided'; } return messageBody; }
内容的提问来源于stack exchange,提问作者Nathaniel MacKinlay
相关产品推荐
相关产品推荐

