如何扩展joi.any()
以向其添加新规则?因此,我可以在任何现有类型上使用该规则,例如joi.boolean()
或joi.string()
。
我知道如何用扩展来扩展joi以添加新的自定义类型,但这样做我无法将新类型与现有类型结合起来。
我希望能够做joi.boolean().myrule()
和joi.string().myrule()
以及任何其他现有类型。我该怎么做?如果有什么不同的话,我会把它和最新版本的joi一起使用。
是否有某种方法可以使joi.any.extend()
将新规则添加到any()
而不是joi.extend()
(它添加了一个新类型(。
我看到了代码,但我认为这是不可能的(如果我错了,请纠正我(。你能做的最接近的事情是:https://github.com/hapijs/joi/blob/master/test/extend.js#L95
const custom = Joi.extend({
type: /^s/, // <<< regex for type
rules: {
hello: {
validate(value, helpers, args, options) {
return 'hello';
},
},
},
});
const string = custom.string().hello();
expect(string.type).to.equal('string');
expect(string.hello().validate('goodbye').value).to.equal('hello');
const symbol = custom.symbol().hello();
expect(symbol.type).to.equal('symbol');
expect(symbol.hello().validate(Symbol('x')).value).to.equal('hello');
因为在https://github.com/hapijs/joi/blob/master/lib/index.js#263:
for (const type of joi._types) {
if (extension.type.test(type)) {
const item = Object.assign({}, extension);
item.type = type;
item.base = joi[type]();
extended.push(item);
}
}
Joi正在使用type
正则表达式检查它所拥有的所有类型。
也许您可以使用正则表达式创建一个customType,该正则表达式与您想要匹配的类型(或所有类型(相匹配。然后,您可以使用custom.string()
而不是Joi.string()
。