typescript 如何在Yup中使Schema.test成为可选的?

m4pnthwp  于 2023-03-31  发布在  TypeScript
关注(0)|答案(1)|浏览(94)

下面是一个自定义的test的例子,我使用它来验证上传的文件是否是一个图片。问题是,即使我没有向这个模式添加.required(),它也是必需的,因为一个未定义的值不会通过我的测试:

export const imageFileSchema = .mixed<Express.Multer.File>().test(
    "valid-image",
    "The uploaded file is not a valid image",
    async file => {
        if (!file) return false;
        const result = await validateBufferMIMEType(file.buffer, {
            allowMimeTypes: ["image/jpeg", "image/png"],
        });
        return result.ok;
    }
)

我的想法是,如果file为null,则返回true而不是false

if (!file) return true;

但是如果值是未定义的,通过图像测试感觉就不对了。
这是正确的做法吗?

l0oc07j2

l0oc07j21#

我不熟悉你在问题中使用的类型,因此我在这个答案中使用FileList作为输入type=“file”。
FileList示例的长度〉0时,执行测试,否则返回true,如下所示。

someFile: yup.mixed<FileList>().defined()
    .test(
        "custom-validation-name",
        "Custom error message",
        (files: FileList) => files?.length > 0             
            ? files[0].size < 1000 // perform the test
            : true                 // skip the test and return true
    )

相关问题