grats icon indicating copy to clipboard operation
grats copied to clipboard

Force optional args to accept null

Open captbaritone opened this issue 2 years ago • 2 comments

If a field arg is typed in the DSL as optional, a request that passes an explicit null, is considered valid. This means graphql-js will pass through a user's explicit null. This, in turn, means that if Grats is going to generate an optional argument, the user's field resolver must be capable of accepting null.

Today it's possible to define a function which is not expecting in its typescript types, but could get passed a null at runtime:

/** @gqlType */
export default class Query {
  /** @gqlField */
  someField(args: {greeting: string | undefined}): string {
    if(args.greeting === undefined) {
      return "Hello!"
    }
    return args.greeting; // OOPS! Might return `null` here, which is not a `string`.
  }
}
type Query {
  someField(greeting: String): String
}

Playground

I think the best solution here is for Grats to error in this case and force you to add | null to the argument's type.

captbaritone avatar Oct 29 '23 17:10 captbaritone

IMO it's the only type-safe solution, since Grats can't/won't alter how graphql-js handles this case?

mandx avatar Oct 30 '23 17:10 mandx

In theory when we do applyServerDirectves (or in some similar place) we could wrap the resolver functions to match what the user-defined code expects, but I think that's probably not the right direction to head.

captbaritone avatar Oct 30 '23 18:10 captbaritone

This has been fixed for a while

captbaritone avatar Dec 13 '24 03:12 captbaritone