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. Спасибо за подержку!

Материал опубликован при поддержке сайта habr.com
Комментарии

    Актуальные новости по теме "Array"