我的物件型別具有“translations”屬性,其中可以翻譯成不同語言的欄位被傳遞到特定的“lang”屬性中,如下面的架構所示。
始終需要英文翻譯,其余語言是可選的,我可以通過設定.default(undefined)為可選語言來實作這一點。
當存在一種語言并且對其內部欄位的驗證失敗時,錯誤始終與欄位本身相關聯(在這種情況下為“名稱”)。這種行為是意料之中的。
我還想實作什么,但我不知道如何在“翻譯”屬性“en”不存在類似'An English translation is required'.
const categoryTranslationsSchema = object({
name: string()
.min(3, 'Must have at least 3 characters.')
.max(16, 'Cannot be longer than 16 characteres.')
.required('Must provide a name.')
})
const categorySchema = object({
slug: string()
.min(3, 'Must have at least 3 characters.')
.max(16, 'Cannot be longer than 16 characteres.')
.lowercase()
.trim()
.matches(/^(?![0-9-] $)(?:[a-z]{2,}-?|[0-9]-?) (?<!-)$/gm, 'Must start with a letter and can'
' only contain letters, numbers or dashes (no more than one consecutive).')
.required('The slug is required.'),
translations: object({
en: categoryTranslationsSchema,
es: categoryTranslationsSchema
.default(undefined),
de: categoryTranslationsSchema
.default(undefined)
})
})
uj5u.com熱心網友回復:
我認為您應該考慮使用自定義語言環境字典。當驗證測驗未提供任何訊息時,這允許您自定義 Yup 使用的默認訊息。如果自定義字典中缺少任何訊息,則錯誤訊息將默認為 Yup 的訊息。它還提供啟用多語言支持。 https://github.com/jquense/yup#using-a-custom-locale-dictionary
import { setLocale } from 'yup';
setLocale({
mixed: {
default: 'N?o é válido',
},
number: {
min: 'Deve ser maior que ${min}',
},
});
// now use Yup schemas AFTER you defined your custom dictionary
let schema = yup.object().shape({
name: yup.string(),
age: yup.number().min(18),
});
schema.validate({ name: 'jimmy', age: 11 }).catch(function (err) {
err.name; // => 'ValidationError'
err.errors; // => ['Deve ser maior que 18']
});
如果您無法獲得您正在尋找的內容,請嘗試將其與yup.lazy創建在驗證/轉換時評估的架構相結合 。這也可以嵌套在您的物件架構中。https://github.com/jquense/yup#yuplazyvalue-any--schema-lazy
這是您可以做什么的想法:
translations: Yup.lazy(value => {
switch (typeof value) {
case 'object':
return Yup.object(); // schema for object
case 'string':
return Yup.string().min(MIN_DESC_LENGTH).max(_MAX_NAME_LENGTH); // schema for string
default:
return Yup.mixed(); // here you can decide what is the default
}
})
uj5u.com熱心網友回復:
好吧,驗證嵌套物件時的問題是它們默認為空物件 {},因此它通過驗證并進入內部驗證。
然后,解決方案是使所有物件.default(undefined)都可以通過這種方式向物件驗證本身添加更多要求,在這種情況下使其成為必需。
所以解決方案就這么簡單:
const categorySchema = object({
slug: string()
.min(3, 'Must have at least 3 characters.')
.max(16, 'Cannot be longer than 16 characteres.')
.lowercase()
.trim()
.matches(/^(?![0-9-] $)(?:[a-z]{2,}-?|[0-9]-?) (?<!-)$/gm, 'Must start with a letter and can'
' only contain letters, numbers or dashes (no more than one consecutive).')
.required('The slug is required.'),
translations: object({
en: categoryTranslationsSchema
.default(undefined)
.required('An English translation must be provided.'),
zh: categoryTranslationsSchema
.default(undefined)
}).default(undefined)
.required('Translations must be defined.'),
})
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/365898.html
標籤:javascript 验证 是的
下一篇:無法回圈到輸入驗證代碼中的某個點
