{
                  
                  
                      defaultValue?: T,
                  
                  
                      validators?: Validator<T>[],
                  
                  
                      errorMessages?: any[],
                  
                  
                      errorTypes?: any[]
                  
                  
                  }
                  
                  
                  
                  
                  
                  /**
                  
                  
                   * Хук для установки значений объекта и его валидации,
                  
                  
                   * возвращает объект содержащий :
                  
                  
                   * value -  значение,
                  
                  
                   * setValue -  колбэк для установки значения,
                  
                  
                   * errorType - код первой ошибки,
                  
                  
                   * errorMessage - сообщение первой ошибки,
                  
                  
                   * isError -  флаг есть ли ошибка
                  
                  
                   *
                  
                  
                   * @param defaultValue - дефолтное значение объекта
                  
                  
                   * @param validators - массив валидаторов, функций принимающих в качестве параметра объект
                  
                  
                   * @param errorMessages - массив сообщений об ошибке
                  
                  
                   * @param errorTypes - массив кодов ошибки
                  
                  
                   *
                  
                  
                   * @return Объект содержащий :
                  
                  
                   * value -  значение,
                  
                  
                   * setValue -  колбэк для установки значения,
                  
                  
                   * errorType - код первой ошибки,
                  
                  
                   * errorMessage - сообщение первой ошибки,
                  
                  
                   * isError -  флаг есть ли ошибка
                  
                  
                  
                  
                  
                   export function useStateObjectWithValidation<T>(
                  
                  
                   options: UseStateWithValidationOptions<T>
                  
                  
                   );
                  
                  
                   */
                  
                  
                  export function useStateObjectWithValidation<T>(
                  
                  
                      defaultValue: T = null,
                  
                  
                      validators: Validator<T>[] = null,
                  
                  
                      errorMessages: any[] = null,
                  
                  
                      errorTypes: any[] = null
                  
                  
                  ) {
                  
                  
                      const [value, setValue] = useState(defaultValue);
                  
                  
                  
                  
                  
                      let errorType = null;
                  
                  
                      let errorMessage = null;
                  
                  
                      let isError = false;
                  
                  
                  
                  
                  
                      for (let i = 0; i < validators?.length ?? 0; i++) {
                  
                  
                          const validator = validators[i];
                  
                  
                          if (!validator(value)) {
                  
                  
                              errorType = errorTypes?.[i] ?? null;
                  
                  
                              errorMessage = errorMessages?.[i] ?? null;
                  
                  
                              isError = true;
                  
                  
                              // всегда возвращаем первую ошибку валидации
                  
                  
                              break;
                  
                  
                          }
                  
                  
                      }
                  
                  
                      return {value, setValue, errorType, errorMessage, isError};
                  
                  
                  }
                  
                  
                  
                  
                  
                  /**
                  
                  
                   * Хук для установки значений объекта и его валидации,
                  
                  
                   * API сделан по аналогии с useState, но дополнительно возвращает третий элемент кортежа - ошибку валидации
                  
                  
                   *
                  
                  
                   * @param defaultValue - дефолтное значение объекта
                  
                  
                   * @param validators - массив валидаторов, функций принимающих в качестве параметра объект
                  
                  
                   * @param errorMessages - массив сообщений об ошибке
                  
                  
                   * @param errorTypes - массив кодов ошибки
                  
                  
                   *
                  
                  
                   * @return Кортеж из трех элементов содержащий :
                  
                  
                   * первый элемент -  значение,
                  
                  
                   * второй элемент -  колбэк для установки значения,
                  
                  
                   * третий элемент - объект содержащий: { isError - флаг наличия ошибки, errorType - код первой ошибки,
                  
                  
                   * errorMessage - сообщение первой ошибки }
                  
                  
                   */
                  
                  
                  export function useStateWithValidation<T>(
                  
                  
                      defaultValue: T = null,
                  
                  
                      validators: Validator<any>[] = null,
                  
                  
                      errorMessages = null,
                  
                  
                      errorTypes = null
                  
                  
                  ) {
                  
                  
                      const o = useStateObjectWithValidation(validators, errorMessages, errorTypes);
                  
                  
                      return [
                  
                  
                          o.value,
                  
                  
                          o.setValue,
                  
                  
                          {
                  
                  
                              isError: o.isError,
                  
                  
                              errorType: o.errorType,
                  
                  
                              errorMessage: o.errorMessage
                  
                  
                          }];
                  
                  
                  }
                  
                  
                  
                  
                  
                  /**
                  
                  
                   * Хук для установки значений объекта и его валидации,
                  
                  
                   * API сделан по аналогии с useState, но дополнительно возвращает третий элемент кортежа - ошибку валидации
                  
                  
                   *
                  
                  
                   * @param options - опции типа UseStateWithValidationOptions
                  
                  
                   *
                  
                  
                   * @return Кортеж из трех элементов содержащий :
                  
                  
                   * первый элемент -  значение,
                  
                  
                   * второй элемент -  колбэк для установки значения,
                  
                  
                   * третий элемент - объект содержащий: { isError - флаг наличия ошибки, errorType - код первой ошибки,
                  
                  
                   * errorMessage - сообщение первой ошибки }
                  
                  
                   */
                  
                  
                  export function useStateWithValidationOptional<T>(options: UseStateWithValidationOptions<T>) {
                  
                  
                      return useStateWithValidation(
                  
                  
                          options.defaultValue,
                  
                  
                          options.validators,
                  
                  
                          options.errorMessages,
                  
                  
                          options.errorTypes
                  
                  
                      );
                  
                  
                  }
                  
                  
                
А теперь все поля заблокируй (:
Обсуждают сегодня