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
相关产品推荐
相关产品推荐

