繁体   English   中英

Joi.object().keys() 和 append() 方法在添加更多键方面有什么区别

[英]What's the difference between Joi.object().keys() and append() methods in terms of adding more keys

我有这段代码

const baseSchema = Joi.object.keys({
   name: Joi.string().required()
})

现在我想为这个模式添加更多的键,我可以写

const basicInfoSchema = baseSchema.keys({
   address: Joi.string().required(),
   phoneNumber: Joi.number().required()
})

或者

const basicInfoSchema = baseSchema.append({
   address: Joi.string().required(),
   phoneNumber: Joi.number().required()
})

两者有什么区别?

append有一个通用参数,可以为预期的 object 提供一些类型。 就像Joi.object<>()一样。 keys没有通用参数。

还查看下面的源代码(版本 17.6.0),您可以看到 append 调用引擎盖下的keys 我不会粘贴文档,但您可以在那里阅读https://joi.dev/api/?v=17.6.0

基本上, append只做keys方法的else子句。 keys也可以“允许所有”(允许任何键)或“不允许任何键”(不允许任何键)现有键。 keys有两个额外的功能。

        append: {
            method(schema) {

                if (schema === null ||
                    schema === undefined ||
                    Object.keys(schema).length === 0) {

                    return this;
                }

                return this.keys(schema);
            }
        },
        keys: {
            method(schema) {

                Assert(schema === undefined || typeof schema === 'object', 'Object schema must be a valid object');
                Assert(!Common.isSchema(schema), 'Object schema cannot be a joi schema');

                const obj = this.clone();

                if (!schema) {                                      // Allow all
                    obj.$_terms.keys = null;
                }
                else if (!Object.keys(schema).length) {             // Allow none
                    obj.$_terms.keys = new internals.Keys();
                }
                else {
                    obj.$_terms.keys = obj.$_terms.keys ? obj.$_terms.keys.filter((child) => !schema.hasOwnProperty(child.key)) : new internals.Keys();
                    for (const key in schema) {
                        Common.tryWithPath(() => obj.$_terms.keys.push({ key, schema: this.$_compile(schema[key]) }), key);
                    }
                }

                return obj.$_mutateRebuild();
            }
        },

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM