TypeScript动态访问类静态对象属性报ts(7053)错误如何解决?
报错根因
你拼接得到的key是普通string类型,而TypeScript默认不允许用任意字符串索引类的静态属性集合,无法确认这个字符串是否真的对应MonkeyParams上存在的静态属性,所以抛出7053错误。
解决方案
方案1:快速类型断言(最省事)
直接给动态生成的key做类型断言,告诉TS这个key一定是MonkeyParams的合法静态属性,修改你业务代码里key的定义即可:
let key = `${query}Param` as keyof typeof MonkeyParams; this._methodOptions.requestParameters[methodPropName] = MonkeyParams[key].required;
适用场景:临时修复,不需要修改原有类定义,且你能保证query拼接出来的key一定存在于MonkeyParams中。
方案2:收窄query的类型(最安全)
如果你的queryList的可选值是固定的,直接给queryList指定更精确的类型,不需要额外断言就能通过类型检查:
// 先定义所有合法的query值的联合类型 type ValidQuery = 'id' | 'fromTime' // 给queryList指定类型 const queryList: ValidQuery[] = ['id', 'fromTime'] queryList.forEach(query => { let methodPropName = 'method.request.querystring.' + query; let integrationPropName = 'integration.request.querystring.' + query; // 这里query已经是合法值,拼接出来的key天然符合类型要求 let key = `${query}Param` as const this._methodOptions.requestParameters[methodPropName] = MonkeyParams[key].required; this._lambdaOptions.requestParameters[integrationPropName] = methodPropName; })
适用场景:query可选值范围可控,能获得最全的类型校验,拼错key或者query传了非法值都会提前报错。
方案3:给MonkeyParams加静态索引签名(最灵活)
如果你后续会频繁新增参数,不想每次更新联合类型,可以直接在MonkeyParams类里加静态索引签名,声明所有字符串类型的key对应的属性都是ParameterObject类型:
export class MonkeyParams { constructor() {} // 新增这一行索引签名 static [key: string]: interfaces.ParameterObject; static idParam : interfaces.ParameterObject = { // 原有属性保持不变 }; // 其他原有静态属性保持不变 }
修改后原有业务代码不需要改动就可以正常运行。
适用场景:参数会频繁新增,不想每次维护类型,牺牲少量类型安全性换开发效率。
内容的提问来源于stack exchange,提问作者monkey
相关产品推荐
相关产品推荐

