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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 11:12:03