Типы всегда указываются c для отдельного поля. Поле по умолчанию может иметь значение NULL или оно может быть ненулевым. В этом случае GraphQL проверит ваш вывод на предмет обнуляемости. Любая проверка, выходящая за рамки этого, должна проводиться на уровне решателя.
При этом можно добиться аналогичного эффекта, используя объединение или интерфейс.
type Query {
foo: Foo
}
type Foo1 {
obj1: MyObj1!
}
type Foo2 {
obj2: MyObj2!
}
union Foo = Foo1 | Foo2
Делая каждое поле незаполненным null гарантирует, что для данного типа , поле не может быть пустым. Во время выполнения поле с типом Foo
всегда будет преобразовываться в один из двух конкретных типов (Foo1
или Foo2
). Поэтому, если мы запросим поле foo
, мы получим либо
{
"foo": {
"obj1": {...}
}
}
, либо
{
"foo": {
"obj2": {...}
}
}
Обратите внимание, что в этом случае obj1
или obj2
будет не будет нулевым в ответе - скорее, оно вообще будет отсутствовать в ответе.