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

React Native集成Mobx时赋值数组遇[serializr]非原始值错误求助

解决serializr报错:"this value is not primitive: 14"

看起来你遇到的问题是serializr在序列化Task类中的tools数组时,无法正确识别数组元素的类型导致的。让我一步步帮你分析和解决:

错误原因

serializr的@persist装饰器默认不会自动推断数组元素的序列化规则——即使元素是像数字14这样的原始类型。当你直接给数组加上@persist而不指定元素类型时,serializr会尝试用默认的序列化逻辑处理,这就会触发"不是原始类型"的错误(尽管14本身是原始类型,但serializr不知道数组里的元素应该按原始类型处理)。

解决方案

1. 为数组指定正确的序列化规则

修改Task类中tools字段的装饰器,明确告诉serializr这是一个原始类型的数组:

import { persist, list, primitive } from 'serializr';
import { observable } from 'mobx';

class Task {
  @persist @observable id = '';
  @persist @observable title = '';
  @persist @observable description = '';
  // 使用list(primitive())明确数组元素是原始类型
  @persist(list(primitive())) @observable tools = [];

  constructor(id, title, description, tools) {
    this.id = id;
    this.title = title;
    this.description = description;
    // 确保赋值的是数组,若传入的是undefined/null,给个默认空数组
    this.tools = tools || [];
  }
}

如果你觉得list(primitive())太啰嗦,也可以使用简写的字符串形式(serializr支持部分类型的简写):

@persist('list') @observable tools = [];

2. 检查构造函数的赋值逻辑

确保你在实例化Task时,传入的tools参数确实是一个数组,而不是单个值(比如不小心传了14而不是[14])。这种情况也会触发类似的错误,因为serializr期望处理数组,却收到了单个原始值。

3. 确认Mobx与serializr的兼容性

如果你是直接给this.tools赋值普通数组,Mobx会自动将其转换为observable数组,这和serializr是兼容的。但如果你是手动操作observable数组(比如用push/replace),也没问题——serializr能正确处理Mobx的observable数组。

验证

修改后,重新测试赋值逻辑,比如:

const task = new Task('1', 'Test Task', 'Description', [14, 25, 36]);
// 此时序列化这个task对象应该不会再报错

这样应该就能解决你遇到的serializr序列化错误了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:49:36