GraphQL Union Types at Woovi
Tags: graphql, programming
Published: 2023-02-07 14:14:56

GraphQL is a popular query language for APIs that provides a flexible and efficient way to retrieve data from a server. One of the key features of GraphQL is the ability to define union types, which allow you to return multiple object types from a single field. In this post, we will take a closer look at union types in GraphQL and how to implement them in JavaScript using the GraphQL.js library. We will cover the basics of union types, including their definition and usage, and explore real-world scenarios where they can be applied to simplify and improve the performance of your API. Whether you are a seasoned GraphQL developer or just starting out, this post will provide valuable insights into the power and versatility of union types.

## Union types

Union types are very similar to interfaces, but they don't get to specify any common fields between the types.

See the [official doc](https://graphql.org/learn/schema/) to understand more about the concept.

## Union Types in GraphQL Code First

When coding with graphql code first you can declare your union type like below.

For the follow example lets have in mind the following scenario:

- we have an array field that is an array of payment methods
- this payment methods can be `CREDIT_CARD | DEBIT_CARD`
- when saving the payment method each one will have it own fields with one in common: `method`
- the method will carry the payment method type
- `method: 'CREDIT_CARD'`

### Union Type - Sub Types

we start declaring a type for each payment method

```ts
export const PaymentMethodCreditCardType = new GraphQLObjectType({
  name: 'PaymentMethodCreditCard',
  fields: () => ({
    method: {
      type: new GraphQLNonNull(GraphQLString),
      resolve: (paymentMethodCreditCard) => paymentMethodCreditCard.method,
    },
  }),
});

export const PaymentMethodDebitCardType = new GraphQLObjectType({
  name: 'PaymentMethodDebitCard',
  fields: () => ({
    method: {
      type: new GraphQLNonNull(GraphQLString),
      resolve: (paymentMethodDebitCard) => paymentMethodDebitCard.method,
    },
  }),
});
```

### Union Type - The Type itself

then, we declare the union type that will consume the both types above:

```ts
export const PaymentMethodUnionType = new GraphQLUnionType({
  name: 'PaymentMethodUnion',
  description:
    'Represents a generic payment method type (credit card | debit card)',
  types: () => [PaymentMethodCreditCardType, PaymentMethodDebitCardType],
  resolveType: (data: Record<string, unknown> | Record<string, unknown>) => {
    if (data.method === 'CREDIT_CARD') {
      return PaymentMethodCreditCardType.name;
    }

    if (data.method === 'DEBIT_CARD') {
      return PaymentMethodDebitCardType.name;
    }

    return null;
  },
});
```

note:

- the resolveType will receive the value passed from the parent
- since the field is an array it will be the items of array
- we map them by the method previously mentioned above
- then point to the right type

### Union Type - Exposing it

We expose the `paymentMethods` as an array of the payment methods consuming the union type

```ts
paymentMethods: {
  type: new GraphQLList(PaymentMethodUnionType),
  resolve: (payment) => payment?.paymentMethods,
},
```

### Union Type - Consuming it

In the frontend we just ask it to the graphql, for example, in a mutation where set the selected payment methods for it and return the field filled:

```tsx
const query = graphql`
  mutation PaymentMethodAddMutation(
    $input: PaymentMethodAddInput!
  ) {
    PaymentMethodAdd(input: $input) {
      error
      payment
      id
      paymentMethods {
        ... on PaymentMethodCreditCard {
          method
        }
        ... on PaymentMethodDebitCard {
          method
        }
      }
    }
  }
`;
```

Now, you can have your payment methods having specific fields to each one.

---
If you want to work in a startup in its early stages, This  is your chance. [Apply today!](https://woovi.com/jobs/)

---

[Woovi](https://woovi.com/) is a Startup that enables shoppers to pay as they please. To make this possible, Woovi provides instant payment solutions for merchants to accept orders.

If you want to work with us, we are [hiring](https://woovi.com/jobs/)!

---

Photo of <a href="https://unsplash.com/@martinols3n?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Martin Olsen</a> na <a href="https://unsplash.com/pt-br/fotografias/szfPB4X-FWk?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>