Из spec :
По умолчанию все типы в GraphQL обнуляются;нулевое значение является действительным ответом для всех вышеперечисленных типов.Чтобы объявить тип, который запрещает нуль, можно использовать ненулевой тип GraphQL.Этот тип переносит базовый тип, и этот тип действует идентично этому упакованному типу, за исключением того, что null не является допустимым ответом для типа переноса.Завершающий восклицательный знак используется для обозначения поля, в котором используется ненулевой тип, например: name: String!.
Другими словами, типы в GraphQL по умолчанию обнуляются.Восклицательный знак после типа специально определяет этот тип как ненулевой.
Это имеет различные последствия в зависимости от того, где используется тип.
Вывод
Когда не нольприменяется к типу поля , это означает, что если сервер разрешит это поле в null
, ответ не пройдет проверку.Вы все еще можете получить частичный ответ, если ошибка не распространяется полностью до корня .
Например, для такой схемы, как:
type Query {
user: User
}
type User {
id: ID!
}
Здесь поле id
не является нулевым.Помечая поле как ненулевое, мы фактически гарантируем , что мы никогда не вернем ноль для этого поля.Если сервер возвращает ноль, это означает, что что-то пошло не так, и мы хотим выдать ошибку проверки.
Ввод
Когда ненулевое значение применяется к типу input , подобно аргументу, полю входного объекта или переменной, делает этот ввод обязательным.Например:
type Query {
getUser(id: ID!, status: Status): User
}
Здесь аргумент id
не равен нулю.Если мы запрашиваем поле getUser
, нам всегда нужно будет предоставить аргумент id
для него.С другой стороны, поскольку аргумент status
может иметь значение NULL, он необязательный и может быть опущен.Это относится и к переменным:
query MyQuery ($foo: ID!) {
getUser(id: $foo)
}
Поскольку переменная $foo
не равна нулю, при отправке запроса она не может быть опущена и ее значение не может быть равно null
.
Специальное примечание о типах переменных
Поскольку поле id
является ненулевым ID
(т.е. ID!
) типом в нашем примере, любая переменная, которую мы передаем, должна также быть ненулевым ID
.Если бы наша переменная $foo
была обнуляемой ID
, мы не смогли бы передать ее аргументу id
.Однако обратное неверно.Если аргумент обнуляем, вы можете передать ему ненулевую переменную.
Другими словами:
+----------+----------+--------+
| Argument | Variable | Valid? |
+----------+----------+--------+
| String | String | ✅ |
| String | String! | ✅ |
| String! | String | ❌ |
| String! | String! | ✅ |
+----------+----------+--------+