Как сжать Yup "когда" проверки

У меня есть несколько полей, которые являются обязательными, если выполняется одно условие. Есть ли лучший способ сжать этот код, чтобы избежать повторения when для всех этих полей?

const requiredForDiffAddress = {
    is: false,
    then: Yup.string().required()
};

export const BillingAddressYupValidationSchemaShape = {
  useShippingAddress: Yup.boolean().default(true).required(),
  street: Yup.string()
      .when('useShippingAddress', requiredForDiffAddress),
  city: Yup.string()
      .when('useShippingAddress', requiredForDiffAddress),
  state: Yup.string()
      .when('useShippingAddress', requiredForDiffAddress),
  zipCode: Yup.string()
      .when('useShippingAddress', requiredForDiffAddress),
};

Или для более реалистичного и сложного образца

const buildRequiredForDiffAddress = requiredText => ({
    is: false,
    then: Yup.string().required(requiredText)
});

export const BillingAddressYupValidationSchemaShape = {
  useShippingAddress: Yup.boolean().default(true).required(),
  street1: Yup.string().when('useShippingAddress', 
      buildRequiredForDiffAddress("How will we know where to send your order?")),
  city: Yup.string().when('useShippingAddress', 
    buildRequiredForDiffAddress("What city do you live in?")),
  state: Yup.string().when('useShippingAddress',
    buildRequiredForDiffAddress("State please!")),
  zipCode: Yup.string().when('useShippingAddress', 
      buildRequiredForDiffAddress("Zip Code please!")),
};

1 ответ

TL;DR: решение, опубликованное в вопросе, вероятно, является лучшим способом обработки полей, которые требуются только в том случае, если условие выполняется на основе значения какого-либо другого поля *

Расширенный ответ

Я немного посмотрел на это после того, как отправил сообщение создателю Yup.

Он предложил

расширить смешанный с requiredIf метод для инкапсуляции такого рода вещей

Я посмотрел на то, что будет связано с этим наряду с использованием некоторой формы lazy, Маршрут расширения, казалось, был лучше, чем ленивый маршрут, но, в конце концов, я чувствую, что то, что у меня есть, вероятно, является лучшим решением.

Я создал этот довольно подробный CodeSandbox, и кто-то хочет нанести удар и найти лучшее решение. Я с удовольствием поменяю принятый ответ на это.

https://codesandbox.io/s/xk4r7nq9z

* ... и вы хотите настраивать обмен сообщениями об ошибках для каждого поля. Кажется, что если вы в порядке с сообщениями по умолчанию, опубликованный пример может оказаться не самым простым решением.

Другие вопросы по тегам