Firestore Rules中如何将函数参数设为可选以消除警告?
Firestore Rules 函数可选参数的规范解决方法
我在Firestore Rules中编写了如下函数,用于检查文档创建时指定字段是否未设置或设置错误:
function isNotInitializingField(fieldName, defaultValue) { return resource == null && !(request.resource.data.keys().hasAny([fieldName]) || request.resource.data[fieldName] == defaultValue); }
当调用该函数不传入defaultValue参数时,会触发如下警告:
WARNING Incorrect number of arguments supplied to function: isNotInitializingField.
我希望将defaultValue设为可选参数,以此消除该警告及后续可能出现的错误。目前我有两种临时解决方案:
- 拆分函数,通过逻辑或分别调用
initializingFieldWithDefaultValue和notInitializingField - 使用数组作为参数,索引0存储字段名,按需在索引1存入默认值,在函数内部判断以避免警告
请问是否存在规范的解决方案,还是只能采用这些临时方案?
规范解决方案
Firestore Rules本身不支持直接声明可选参数,但可以通过以下两种规范方式实现需求:
1. 参数默认值+逻辑判断
通过判断参数是否传入(未传入的参数会被视为undefined),调整函数逻辑:
function isNotInitializingField(fieldName, defaultValue) { const hasDefault = defaultValue != undefined; return resource == null && !( request.resource.data.keys().hasAny([fieldName]) && (!hasDefault || request.resource.data[fieldName] == defaultValue) ); }
- 未传入
defaultValue时,仅检查字段是否未被设置 - 传入
defaultValue时,同时检查字段值是否不等于指定默认值
2. 模拟函数重载
Firestore Rules支持同名函数根据参数个数区分,定义两个版本的函数:
// 无默认值的版本:仅检查字段是否未设置 function isNotInitializingField(fieldName) { return resource == null && !request.resource.data.keys().hasAny([fieldName]); } // 带默认值的版本:检查字段未设置或值不等于默认值 function isNotInitializingField(fieldName, defaultValue) { return resource == null && !(request.resource.data.keys().hasAny([fieldName]) || request.resource.data[fieldName] == defaultValue); }
这种方式调用更直观,根据需求选择对应参数个数的调用即可,不会触发参数数量不匹配的警告,是更推荐的方案。
对比临时方案
- 拆分函数的思路和重载类似,但重载可以保留统一的函数名,调用更简洁
- 数组传参的方式可读性差,不利于后续维护,不推荐作为长期方案
内容的提问来源于stack exchange,提问作者Nestoro
相关产品推荐
相关产品推荐

