All streams
Search
Write a publication
Pull to refresh

Comments 2

Вопрос насчет explanations, сейчас получить данные ошибок валидации можно только из поля экземпляра валидатора IContext.explanations. Выглядит не очень безопасно и не ФПшно. Понимаю, что так сделано потому, что type guard это не настоящий возвращаемый тип, а TS-магический, то есть нельзя сделать функцию с сигнатурой вроде (s: unknown) => [s is string, s].  Есть ли мысли, как это можно красиво решить?
Эта библиотека https://github.com/gcanti/io-ts, например, выдает результат проверки как Either<ИскомыйТип, ТипОшибки>, но в этом случае не используются type guards.

Спасибо, что так вдумчиво отнеслись к моему труду. Попытаюсь ответить на ваши предложения и вопросы.


Выглядит не очень безопасно

ajv (29M скачиваний в неделю) использует подобный подход к сообщениям об ошибке. Аргумент от авторитета, и мне не стыдно))


А если серьёзно, какого рода небезопасности вы предполагаете? очень интересно узнать.


не ФПшно

ФП — не синоним простоты, хотя концепция очень стройная и прекрасная.


с сигнатурой вроде (s: unknown) => [s is string, s]

Недостатки такой сигнатуры обсуждались здесь. Я с их аргументами согласен.


Есть ли мысли, как это можно красиво решить?

  1. Импортируете любимую библиотеку с любимой монадой(Maybe, Either, Writer — любую какую хотите)
  2. Пишите обёртку, которая будет работать примерно так:

function v2(schema: Schema) {
  const isValid = v(schema)
  return (value: any) => isValid(value)
    ? new MyAbstraction(value)
    : new MyErrorAbstration(isValid.explanations)
}

Используете v2 вместо v — везде где эта абстракция вам нужна.


У такого подхода с обертками есть два плюса, которые я считаю важными:
1) Вам не нужно беспокоится, что в quartet абстракция не такая мощная, или например — что она не моноид, а вам обязательно нужно, чтобы результаты валидаций — можно было конкатенировать.
2) Тем, которым ваша абстракция не по душе — не обязаны её использовать, и quartet их не заставляет.


Поэтому то quartet и сделан так, что даёт вам свободу выбора абстракции.


А базовая абстракция c Type Guards, по моему опыту часто вполне достаточна и наиболее легко воспринимается.


io-ts

Хорошая штука, но отнюдь, не очень простая

Sign up to leave a comment.

Articles