GraphQL issues with __typename and interfaces/unions
pstoica opened this issue · comments
I'm trying to use this library to mock Apollo and am running into a few issues when using the generics (.query<Query, Variables>
):
__typename
is required and expects a predetermined value.String
is a superset and won't work.- Workaround:
__typename: () => "User" as const,
- Workaround:
- Interfaces (and possibly unions).. are a bit odd.
- Some of these fields are only present in some implementations.
.create
has no awareness of this, but I do expect to perform.find
on one collection to find any of the types, since agetAnimal
query might return any type of animal. - I also end up defining defaults for all fields, even if they're not relevant to that type.
- The
__typename
ends up determining what objects are compatible. I can no longer enforce a union here (e.g. Animal interface potentially has"Cat" | "Dog" | "Elephant"
) since the__typename
determines how the type is matched and what fields must be present. __typename
can technically beundefined
, butnullable
only adds| null
. I don't really want a default here.- Workaround:
__typename: () => "Cat" as any,
(orundefined as any
will work too)
- Some of these fields are only present in some implementations.
At this point it's a little easier to use .query<any, Variables>
, but the types were otherwise helpful for developer experience and catching missing fields.