为什么无法通过字符串变量访问类实例的公有字段?
问题根因
这个是TypeScript静态类型检查触发的报错,核心原因是:
- 你直接写
i["avg"]时,TS可以静态识别到"avg"是i所属类的合法公有属性,因此不会报错 - 当你把
"avg"赋值给一个string类型的变量entryValueKey后,TS只会将该变量识别为普通字符串,不会追踪其实际值是否属于i所属类的合法属性名,因此默认不允许用它索引类实例,会抛出类型错误。
可行解决方案
以下三种方案按推荐优先级排序:
方案1:给存储属性名的变量添加类型约束
假设你的类名为MyClass,直接声明变量是该类的合法属性集合的类型即可:const entryValueKey: keyof MyClass = "avg"; // 后续直接用i[entryValueKey]就不会报错如果不想显式写类名,也可以用typeof动态推导:
const entryValueKey: keyof typeof i = "avg";方案2:索引时临时使用类型断言
如果你不想修改变量本身的类型,可以在索引时明确告诉TS你确定这个字符串是合法属性:entry[j] = i[entryValueKey as keyof typeof i]方案3:给类添加索引签名(不推荐)
如果你的场景确实需要用任意字符串索引该类的实例,可以在类定义里加索引签名关闭相关检查:class MyClass { avg: number; // 其他属性... [key: string]: any; // 新增这一行 }这个方案会关闭该类所有属性的类型校验,除非特殊场景否则不建议使用。
内容的提问来源于stack exchange,提问作者Fastest Man
相关产品推荐
相关产品推荐

