Как стать автором
Обновить

Комментарии 10

Приветствую! Подскажите, думали ли вы о том, как быть если нужны человеко-читаемые сообщения об ошибках в валидации?
Например для валидации om.number.and.custom(value => value > 18) — тут может быть два сообщения — или «введите», или «должен быть совершеннолетним»

Т.е. не только указать туда, где ошибка, но еще и сказать какая?

Привет. Можно научить понимать возвращаемую валидатором строку как сообщение об ошибке при неудачной проверке:


om.number.and.custom(value => value > 18 || 'Вы ещё слишком маленький')

Можно в этой строке некоторые простые замены делать, например, {keypath} заменять на место где случилась ошибка.


Ещё вариант — научить .custom() понимать не только функцию, но и объект с функцией и строкой ошибки:


om.number.and.custom({
    validator: value => value > 18,
    message: 'Вы ещё слишком маленький ({keypath})'
});

Если нужно такое, создайте issue чтобы я не забыл. Сделаю в скором времени.

> value > 18
> или «должен быть совершеннолетним»

На всякий позанудствую — совершеннолетний, это value >= 18
Мало ли кто скопирует

Позанудствую тоже, но есть страны, где совершеннолетие наступает не в 18 лет

Реализовал оба варианта. keypath подставляется сам когда есть вложенность. Вместо message можно использовать type, в таком случае сообщение об ошибке будет сформировано с учётом .or:


om(om.custom({ validator, type: 'type1' }).or.custom({ validator, type: 'type2' }), type3);
// бросит TypeError('Expected "type1" or "type2"')

Примеры в сообщении выше тоже рабочие.

Круто, спасибо!
Насколько я понимаю, io-ts тоже можно использовать для валидации
github.com/gcanti/io-ts

Интересная идея с возможностью извлекать статический тип из валидатора. Надо будет попробовать так сделать.

И как успехи?


Я вот так это сделал, если интересно: https://github.com/eigenmethod/mol/tree/master/data


const Maybe = Pipe( Nullable , Optional )

const UserData = Rec({
    name: Str,
    age: Maybe( Int ),
});

const ImprovedUserData = UserData({
    ... UserData.config,
    friends: List( UserData ),
});

const ivan = ImprovedUserData({
    name: 'Иванушка',
    age: 20,
    friends: [{ name: 'Алёнушка', age: 18 }]
})
type IvanType = typeof ImprovedUserData.Value
/**
IvanType == {
    name: string
    age?: number | null | undefined
    friends?:
        | {
            name: string
            age?: number | null | undefined
        }[]
        | null | undefined
**/
Здравые идеи, лаконичный синтаксис, достойный вклад в опенсорс.
Единственное что как вижу слово «велосипед», так сразу в голове что-то скрипит и негодует. Абсолютно любую библиотеку или фреймворк, да и язык программирования можно назвать «велосипедом», как и большую часть кода проектов — у этого слова просто отсутствует значимый смысл. А если бы решения (именно это слово лучше употреблять) не совершенствовать, не создавать более удобные, логичные, производительные кодовые базы и паттерны — тогда о чем вообще слово «разработка»?
За собой наблюдал неприязнь к кастомным решениям только в период юниорства, когда сам не мог ничего толкового создать, и умел только компоновать чьи-то решения. А так как юниоров всегда пруд пруди, видимо они и распространяют везде это словечко
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории