Union
This example shows how to work with GraphQL union types in the TypeScript interface.
ts
import { Graffle } from './graffle/__.js'
const pokemon = Graffle.create()
const battles = await pokemon.query.battles({
__typename: true,
___on_BattleRoyale: {
date: true,
combatants: {
trainer: {
name: true,
},
pokemons: {
name: true,
}
},
winner: {
name: true,
},
},
___on_BattleTrainer: {
date: true,
combatant1: {
trainer: {
name: true,
},
pokemon: {
name: true,
},
},
combatant2: {
trainer: {
name: true,
},
pokemon: {
name: true,
},
},
winner: {
name: true,
},
},
___on_BattleWild: {
date: true,
trainer: {
name: true,
},
pokemon: {
name: true,
},
wildPokemons: {
name: true,
},
result: true,
},
})
// The following contrived switch console.logs how the returned type is a discriminated union.
// After checking the __typename, the type is known to be one of the possible battle types
// and TypeScript narrows accordingly.
const dateFormatter = new Intl.DateTimeFormat(`en-US`, { timeZone: `UTC` })
for (const battle of battles) {
switch (battle.__typename) {
case `BattleRoyale`: {
const trainers = battle.combatants?.map(_ => _.trainer?.name)
let info = ``
info += `${battle.__typename} on ${dateFormatter.format(new Date(battle.date ?? 0))}\n`
info += `combatants: ${trainers?.join(`, `) ?? `null`}\n`
info += `winner: ${battle.winner?.name ?? `null`}`
console.log(info)
break
}
case `BattleTrainer`: {
let info = ``
info += `${battle.__typename} on ${dateFormatter.format(new Date(battle.date ?? 0))}\n`
info += `${battle.combatant1?.trainer?.name ?? `null`} vs ${battle.combatant2?.trainer?.name ?? `null`}\n`
info += `winner: ${battle.winner?.name ?? `null`}`
console.log(info)
break
}
case `BattleWild`: {
let info = ``
info += `${battle.__typename} on ${dateFormatter.format(new Date(battle.date ?? 0))}\n`
info += `trainer: ${battle.trainer?.name ?? `null`} with ${battle.pokemon?.name ?? `null`}\n`
info += `vs wild pokemons: ${battle.wildPokemons?.map(_ => _.name).join(`, `) ?? `null`}\n`
info += `result: ${battle.result ?? `null`}`
console.log(info)
break
}
}
}
Outputs
txt
BattleWild on 1/1/2020
trainer: Ash with Pikachu
vs wild pokemons: Squirtle, Bulbasaur
result: pokemonsCaptured
txt
BattleTrainer on 1/1/2003
Ash vs Misty
winner: Misty
txt
BattleRoyale on 1/13/1987
combatants: Ash, Misty
winner: Ash