Skip to content

Unions

GraphQL Unions represent an object that could be one of a list of GraphQL Object types, but provides for no guaranteed fields between those types.

There are 2 ways of defining a union type.

Manual Configuration

class MyType
data class UnionMember1(val one: String)
data class UnionMember2(val two: String)

val schema = KGraphQL.schema {
    val unionExample = unionType("UnionExample"){
        type<UnionMember1>()
        type<UnionMember2>()
    }

    query("myType") {
        resolver { -> MyType() }
    }

    type<MyType> {
        unionProperty("unionExample") {
            returnType = unionExample
            resolver { _, isOne: Boolean ->
                if (isOne) {
                    UnionMember1(one = "Hello")
                } else {
                    UnionMember2(two = "World")
                }
            }
        }
    }
}
type MyType {
  unionExample(isOne: Boolean!): UnionExample!
}

type Query {
  myType: MyType!
}

type UnionMember1 {
  one: String!
}

type UnionMember2 {
  two: String!
}

union UnionExample = UnionMember1 | UnionMember2

(!) Currently there is a limitation on union return types for query definitions. This is currently only supported via sealed classes. See more information below.

Sealed Class

Sealed classes will automatically result in a union type.

class MyType

sealed class UnionExample {
    class UnionMember1(val one: String) : UnionExample()
    class UnionMember2(val two: String) : UnionExample()
}

val schema = KGraphQL.schema {
    unionType<UnionExample>()

    // Query definition example:
    query("unionQuery") {
        resolver { isOne: Boolean ->
            if (isOne) {
                UnionExample.UnionMember1(one = "Hello")
            } else {
                UnionExample.UnionMember2(two = "World")
            }
        }
    }

    // Type property example:
    type<MyType> {
        property<UnionExample>("unionProperty") {
            resolver { _, isOne: Boolean ->
                if (isOne) {
                    UnionExample.UnionMember1(one = "Hello")
                } else {
                    UnionExample.UnionMember2(two = "World")
                }
            }
        }
    }
}
type MyType {
  unionProperty(isOne: Boolean!): UnionExample!
}

type Query {
  unionQuery(isOne: Boolean!): UnionExample!
}

type UnionMember1 {
  one: String!
}

type UnionMember2 {
  two: String!
}

union UnionExample = UnionMember1 | UnionMember2