neuledge / computed-types

🦩 Joi like validations for TypeScript
MIT License
364 stars 14 forks source link

Confusing error messages from `either` #169

Open ChrisNixTriller opened 2 years ago

ChrisNixTriller commented 2 years ago

node: 16.14.0 typescript: 4.5.5 computed-types: 1.11.2

      const schema = Schema.either(
        {
          foo: string.equals('X'),
          bar: array.max(0),
          baz: array.min(1),
        },
        {
          foo: string.equals('Y'),
          bar: array.min(1),
          baz: array.max(0),        
        },
      )

      const obj = { foo: 'Y', bar: [], baz: [] }

      const validator = schema.destruct()

      const [err, validatedObj] = validator(obj)

The error message above is bar: Expect array to be minimum of 1 items (actual: 0). This makes sense for the value of foo === 'Y'.

Here's a curious observation... If I use const obj = { foo: 'X', bar: [], baz: [] }, then the error changes to foo: Expect value to equal "Y". Two notes:

  1. I think that the error is harder to understand since the error reports the path foo to be wrong, when arguably it's the baz array that's not matching the schema.
  2. The error differs from the case given in the initial snippet. However, the cases are symmetric about X and Y (apart from the order in the either definition), so one might expect the errors to be similar.

Obviously, the analogous error occurs if I swap the order of the schemas in the either definition.

This is really pedantic, I know. The library is great and hopefully this is just some useful feedback for thought.

moshest commented 2 years ago

either implementation just throws one of the errors it get from its internal items. I think it may be better to throw a custom error like "Can't find a valid type matching the either statement" or something.