我一直在一个新项目中使用Folktale的Validation并且我发现它非常有用,但是我遇到了需要顺序验证的问题。我有一个配置对象,我需要执行以下验证:
- 是一个对象吗?
- 对象的密钥是否有效(它们是否出现在白名单中)?
- 键的值是否有效?
每个验证都依赖于先前的验证 - 如果项目不是对象,验证其键是没有意义的(并且会出错),如果对象没有键,验证它们的值是没有意义的。实际上,如果验证失败,我想短路验证。
我最初的想法是使用Result而不是在其他地方定义和使用的 Validatio , but mixing the two types feels confusing, and I already have
validateIsObject`。
我目前(工作但丑陋)的解决方案在这里:
import { validation } from 'folktale';
import { validateIsObject } from 'folktale-validations';
import validateConfigKeys from './validateConfigKeys';
import validateConfigValues from './validateConfigValues';
const { Success, Failure } = validation;
export default config => {
const wasObject = validateIsObject(config);
let errorMessages;
if (Success.hasInstance(wasObject)) {
const hadValidKeys = validateConfigKeys(config);
if (Success.hasInstance(hadValidKeys)) {
const hasValidValues = validateConfigValues(config);
if (Success.hasInstance(hasValidValues)) {
return Success(config);
}
errorMessages = hasValidValues.value;
} else {
errorMessages = hadValidKeys.value;
}
} else {
errorMessages = wasObject.value;
}
return Failure(errorMessages);
};
我最初采用了使用嵌套matchWith
s 的方法,但这更难阅读。
我该如何改进这个解决方案?