如何让yup.string()要求任意长度的字符串(包括0)

How to get yup.string() to require string of any length (including 0)

我想知道是否有人可以建议我如何让 yup 验证任何长度的字符串(包括长度 0)。

正在使用

yup.string().required().validateSync("")

将在空字符串上抛出错误...

过去推荐的方法是:

string().required().min(0) 

但这种方式不再有效.. (https://github.com/jquense/yup/issues/136#issuecomment-339235070)

有人可以告诉我如何让 yup 要求发送一个字符串,但不会在长度为 0 的字符串上出错吗?

谢谢!

我的建议是放弃 .required(),而是考虑使用 typeError 进行验证,同时启用 strict 以停止 non-string 值被胁迫转化。

这将使您能够允许任何长度的字符串值,同时仍然对非字符串的值出错。

示例:

yup.string().typeError().strict(true).validateSync(1) // Error
yup.string().typeError().strict(true).validateSync(null) // Error
yup.string().typeError().strict(true).validateSync({}) // Error
yup.string().typeError().strict(true).validateSync("") // Valid
yup.string().typeError().strict(true).validateSync("Foo") // Valid

typeError 还有一个可选的 message 参数,允许您在那里提供错误消息,如果您不想稍后再处理它。

我喜欢使用 mixedtesttypeof === 'string':

    firstName: Yup.mixed().test(
        'my test',
        'error: name is not a string',
        (text) => {
            if (typeof text === 'string') {
                return true
            } else {
                return false
            }
        }
    )
Required String that can be Empty

示例字段名为:relevance_factor 与您的要求相同

let relevance_factor = yup
    .string()
    .test(
        'string-can-be-empty',
        MESSAGES.RELEVANCE_FACTOR_REQUIRED,
        function stringCanBeEmpty(value: any) {
            if (typeof value == 'string')
                return true;

            return false;
        }
    )
yup.string().defined().strict(true);

这也适用于 undefined 值。