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

