Ajv-ts версии 0.7 и щепотка typescript
Всем привет! Меня зовут Виталий. Я - инженер по автоматизации тестирования . Сегодня хотелось бы рассказать личную новость для меня и моего творения - Ajv-ts. На днях я смог выпустить версию 0.7. Предыдщая версия была сделана 1 февраля 2024 года! 😱
Кстати, почему родился этот проект можете почитать здесь.
Дисклеимер
Ajv-ts не является официальной библиотекой от команды ajv.
Из-за того, что данный проект родился спонтанно, - то и работаю я над ним в нерабочее время, отсюда и большой перерыв между релизами.
Итак давайте уже перейдем к новым штукам
Error map
Я давно уже приметил эту фичу, но руки никак не доходили. Дело в том, что я использую ajv-error - это официальная библиотека от команды ajv. До этого уже был заложен АПИ, но дело в том, что в прошлой версии в функцию error я принимал только строку. Т.е. любая ошибка была бы сконвертирована в то, что написали. Хотя часто возникают ситуации, когда надо отдельно валидировать. Например тип, и дополнительные свойства у объекта могут возвращать разные сообщения об ошибке. Общее сообщение я не убирал по той причине, что сам ajv-error поддерживает такой формат.
Вот несколько примеров
import s from 'ajv-ts'// beforeconst before = s.object({a: s.number()}).strict().error('Some Error')before.parse(123) // Some Error// extra property is not allowedbefore.parse({a: 1, b: 'qwe'}) // Some Error//afterconst after = s .object({a: s.number()}) .strict() .error({ _: 'generic error', type: 'not an object', additionalProperties: 'extra props are not allowed' })after.parse(123) // not an object// extra props are not allowedafter.parse({a: 1, b: 'qwe'}) // extra props are not allowed
Статическая проверка длинны для строк и массивов
Часто схемы описываются сразу, т.е. динамического контента не так много. Плюс заметил такой баг - я перепутал minLength и maxLength. Тогда мне в голову пришла идея - во что бы то ни стало потренироваться с typescript и попробовать сделать так, чтобы ты низачто не перепутал длины местами.
Уже предвижу коментарии в духе - "так если у меня схема динамическая? получается typescript будет ругаться". Да, придется кастить. Как я уже написал до этого - обычно(≠ всегда) схемы описываются сразу. Я пошел на компромисс. Бонусом к этой фиче идет то, что для конечного полльзователя я сделал удобную систему ошибок.
import s from 'ajv-ts'//beforeconst before = s.string().minLength(3).maxLength(1) // schema OKbefore.parse('hi') // anyway you got an error!// afterconst after = s.string().minLength(3).maxLength(1) // [never, "RangeError: MinLength are greater than MaxLength. MinLength: 3. MaxLength: 1"]// but!const max = 1 as number;const after2 = s.string.maxLength(max) // Error! `RangeError: MinLength are greater than MaxLength. MinLength: undefined. MaxLength: ${number}`
Вот и все, что я хотел показать. Как я уже подчеркивал - это мой личный проект и он требует усилий после основной деятельности, А порой не хватает мотивации на реализацию всех функции, которые задумал.
Тем не менее спасибо за прочтение и правильных схем вам!
Ссылки к статье:
ajv-ts GitHub release 0.7
ajv-errors
telegram канал haradkou_sdet
Не призываю, но я с недавних пор начал вести свой телеграм канал. Пишу обо все, что придет в голову, часто это касается своих проектов, вопросов с собеседований и новостей из мира IT - @haradkou_sdet. Спасибо за подержку!
Написать комментарий