Я знаю, что это старый вопрос, но я столкнулся с той же проблемой и проследил, что происходит.
Когда запускается валидатор, он проверяет, что тип поля сначала совпадает.В этом случае он проверяет, является ли это объектом.Так как это не так и поле не помечено как nullable
, оно не проходит проверку с ошибкой типа.Yup никогда не доходит до точки запуска required()
, так как он освобождается рано.
Так как нам настроить сообщение, отображаемое, когда тип не совпадает, и вы не хотите использовать метод nullable()
?Я посмотрел на источник и обнаружил, что сообщение генерируется здесь .Так что это часть локали объекта.Таким образом, мы можем решить это следующим образом.
import * as Yup from 'yup';
import { setLocale } from 'yup';
setLocale({
mixed: {
notType: '${path} is required',
}
})
Yup.object().shape({
file: Yup.object().shape({
name: Yup.string().required()
}).label('File')
Теперь, когда тип неправильный, будет отображаться ваше новое сообщение.Метод label()
позволяет установить хорошее отображаемое имя для поля, поскольку сообщение будет использоваться в любых недопустимых ситуациях типа в валидаторах.
Другой альтернативой является написание специального валидатора специально для этого поля,но в этом сценарии это кажется излишним.