computed-types icon indicating copy to clipboard operation
computed-types copied to clipboard

Confusing error messages from `either`

Open ChrisNixTriller opened this issue 2 years ago • 1 comments

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.

ChrisNixTriller avatar Mar 29 '22 17:03 ChrisNixTriller

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.

moshest avatar Apr 09 '22 17:04 moshest