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

Mobx中给类私有属性标注observable时报Object literal错误如何解决

问题原因

这个报错是TypeScript类型校验层面的问题,并非Mobx运行时不支持监听私有属性。AnnotationsMap是Mobx定义的用于校验makeObservable第二个参数的类型,它只能识别类的public、protected成员的类型定义,private成员属于类内部私有,不会暴露给外部类型做推导,因此识别不到data字段的存在,触发类型报错。

解决方案
  • 方案1:使用makeAutoObservable替代makeObservable
    这个方法不需要手动传入属性注解映射,自然不会触发注解对象的类型校验问题,Mobx会自动为所有类属性添加合适的响应式注解,私有属性也会被正常识别监听。修改后的代码如下:
    import { makeAutoObservable } from "mobx";
    
    class Base {
      private data: string[];
    
      constructor() {
        this.data = [];
        makeAutoObservable(this);
      }
    
      public getData = (): string[] => {
        return this.data;
      };
    }
    
    export default new Base();
    
  • 方案2:保留makeObservable,添加类型断言
    如果确实需要手动指定注解配置,可以给第二个参数添加类型断言绕开TS校验,运行时Mobx依然可以正常监听私有属性:
    makeObservable(this, {
      data: observable,
    } as any);
    
    不推荐使用// @ts-ignore的方式跳过校验,类型断言的方式更可控。
  • 方案3:使用ES原生私有字段(可选)
    如果你需要运行时层面的私有属性,可以用JS原生的#前缀定义私有字段,Mobx 6+版本对原生私有字段也有完善的响应式支持,搭配makeAutoObservable使用同样不会有类型问题:
    import { makeAutoObservable } from "mobx";
    
    class Base {
      #data: string[];
    
      constructor() {
        this.#data = [];
        makeAutoObservable(this);
      }
    
      public getData = (): string[] => {
        return this.#data;
      };
    }
    
    export default new Base();
    

内容的提问来源于stack exchange,提问作者user13695382

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 06:45:04