AlexGalays / idonttrustlikethat

Validation for TypeScript
40 stars 7 forks source link

Can't use map on object validator that we want to use in a `discriminatedUnion` later #22

Open gbersac opened 1 year ago

gbersac commented 1 year ago

For the following code :

const validator1 = object({ discriminant: literal("A") })
  .map(v => ({...v, uniqueA2: "someValue"})) // this map create an error in the discrimintedUnion
const validator2 = object({ discriminant: literal("B") })
export const finalType = discriminatedUnion("discriminant", validator1, validator2)

we have the following error :

Argument of type 'Validator<{ uniqueA2: string; discriminant: "A"; }>' is not assignable to parameter of type 'ObjectValidator<{ discriminant: LiteralValidator<any> | UnionValidatorOfLiterals<Literal[]>; }>'.
  Property 'props' is missing in type 'Validator<{ uniqueA2: string; discriminant: "A"; }>' but required in type '{ props: { discriminant: LiteralValidator<any> | UnionValidatorOfLiterals<Literal[]>; }; }'

on the line:

export const finalType = discriminatedUnion("discriminant", validator1, validator2)
//                                                          ^^^^^^^^^^

This error appears because the .map lose the information that validator1 is an object validator (it becomes a non specific validator instead). It means we can't use map on object validator that we want to use in a discriminatedUnion later.

Aghamyr commented 1 year ago

I have a similar problem but with nested discrimatedUnion and intersection, after the intersection the object loses the ObjectValidator type and is just a Validator, and so I can't use it in a second discriminatedUnion.

Any possible solution for that ?