OneOf input objects
Some inputs will behave differently depending on what input we choose. Letโs look at the case for
a field named product
, we can fetch a Product
by either its id
or its name
. Currently weโd
make a tradeoff for this by introducing two arguments that are both nullable, now if both are passed
as null (or both non-null) weโd have to handle that in code - the type system wouldnโt indicate that exactly one was required. To fix this, the @oneOf
directive was introduced so we
can create this โexactly one optionโ constraint without sacrificing the strictly typed nature of our GraphQL Schema.
const schema = buildSchema(`
type Product {
id: ID!
name: String!
}
input ProductLocation {
aisleNumber: Int!
shelfNumber: Int!
positionOnShelf: Int!
}
input ProductSpecifier @oneOf {
id: ID
name: String
location: ProductLocation
}
type Query {
product(by: ProductSpecifier!): Product
}
`);
It doesnโt matter whether you have 2 or more inputs here, all that matters is that your user will have to specify one, and only one, for this input to be valid. The values are not limited to scalars, lists and other input object types are also allowed.