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

Firestore规则中递归数据类型的TYPE_RECURSION错误排查求助

解决Firestore规则Bolt转JSON后TYPE_RECURSION错误的思路

问题核心是Firestore规则的类型系统不支持循环递归的类型引用——你的OrderedList→ListItem→OrderedList/BulletList形成了闭环,导致转成JSON规则后触发递归检测错误。以下是可行的解决方法:

1. 扁平化类型结构,消除递归引用

把嵌套的列表类型改成非递归的统一结构,用字段标识类型而非类型本身递归:

Type ListContent {
  type: "ordered" | "bullet" | "text"
  orderedItems: ListItemContent[]?
  bulletItems: ListItemContent[]?
  text: SomeTextNode[]?
}

Type ListItemContent {
  content: ListContent[]
}

所有类型单向引用,无循环依赖,转JSON后可正常解析。

2. 用自定义函数替代静态类型校验

如果必须保留递归结构,放弃Bolt的Type定义,改用规则函数做动态结构验证,绕过类型系统的递归限制:

// 验证ListItem结构
function isValidListItem(data) {
  return data is map && 
    (data.content is SomeTextNode[] || 
     isValidBulletListArray(data.content) || 
     isValidOrderedListArray(data.content));
}

// 验证BulletList数组
function isValidBulletListArray(arr) {
  return arr is array && arr.every(item => 
    item is map && isValidListItem(item.content)
  );
}

// 验证OrderedList数组
function isValidOrderedListArray(arr) {
  return arr is array && arr.every(item => 
    item is map && isValidListItem(item.content)
  );
}

// 规则中使用函数校验
match /lists/{listId} {
  allow read, write: if isValidListItem(resource.data);
}

通过函数递归验证结构,而非依赖静态类型,可避开TYPE_RECURSION错误。

3. 限制递归层级,拆分类型

如果业务允许有限层级的嵌套,将递归结构拆分为固定层级的类型:

Type OrderedListLevel1 {
  content: ListItemLevel1[]
}

Type BulletListLevel1 {
  content: ListItemLevel1[]
}

Type ListItemLevel1 {
  content: SomeTextNode[] | BulletListLevel2[] | OrderedListLevel2[]
}

Type OrderedListLevel2 {
  content: ListItemLevel2[]
}

Type BulletListLevel2 {
  content: ListItemLevel2[]
}

Type ListItemLevel2 {
  content: SomeTextNode[]
}

通过限制嵌套深度消除循环,满足部分场景需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 03:30:52