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

为什么无法通过字符串变量访问类实例的公有字段?

问题根因

这个是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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 17:06:04