Комментарии 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
Мало ли кто скопирует
Реализовал оба варианта. keypath
подставляется сам когда есть вложенность. Вместо message
можно использовать type
, в таком случае сообщение об ошибке будет сформировано с учётом .or
:
om(om.custom({ validator, type: 'type1' }).or.custom({ validator, type: 'type2' }), type3);
// бросит TypeError('Expected "type1" or "type2"')
Примеры в сообщении выше тоже рабочие.
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
**/
Единственное что как вижу слово «велосипед», так сразу в голове что-то скрипит и негодует. Абсолютно любую библиотеку или фреймворк, да и язык программирования можно назвать «велосипедом», как и большую часть кода проектов — у этого слова просто отсутствует значимый смысл. А если бы решения (именно это слово лучше употреблять) не совершенствовать, не создавать более удобные, логичные, производительные кодовые базы и паттерны — тогда о чем вообще слово «разработка»?
За собой наблюдал неприязнь к кастомным решениям только в период юниорства, когда сам не мог ничего толкового создать, и умел только компоновать чьи-то решения. А так как юниоров всегда пруд пруди, видимо они и распространяют везде это словечко
Ом-ням-ням и валидация данных