【发布时间】:2018-06-18 20:27:44
【问题描述】:
我一直在一个新项目中使用Folktale 的Validation,我发现它非常有用,但我遇到了需要顺序验证的难题。我有一个配置对象,我需要执行以下验证:
- is 是一个对象吗?
- 对象的密钥是否有效(它们是否出现在白名单中)?
- 键的值是否有效?
每次验证都依赖于之前的验证 - 如果项目不是对象,验证其键是没有意义的(并且会出错),如果对象没有键,验证它们的值是没有意义的。实际上,如果验证失败,我想短路验证。
我最初的想法是使用Result,而不是在其他地方定义和使用的Validatio, but mixing the two types feels confusing, and I already havevalidateIsObject`。
我目前(工作但丑陋)的解决方案在这里:
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);
};
我最初采用嵌套matchWiths 的方法,但这更难阅读。
如何改进此解决方案?
【问题讨论】:
标签: javascript validation functional-programming folktale