Что такое восклицательный знак в GraphQL?

В файле схемы, который я заметил, есть восклицательные знаки после некоторых типов, например

# Information on an account relationship
type AccountEdge {
  cursor: String!
  node: Account!
}

Что это значит? Я ничего не могу найти об этом ни в документации, ни в гугле ?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Что такое Apollo Client и зачем он нужен?
Что такое Apollo Client и зачем он нужен?
Apollo Client - это полнофункциональный клиент GraphQL для JavaScript-приложений, который упрощает получение, управление и обновление данных в...
83
0
19 787
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это означает, что поле не допускает значения NULL.

См. Дополнительную информацию в Graphql - схемы и типы

Это заняло больше времени, чем я ожидал. Даже шпаргалки по GraphQL и документы Prisma и Apollo явно не упоминали об этом.

Jacob 30.11.2018 01:25

Ссылка на документацию с изящной подсветкой (работает в Chrome): graphql.org/learn/schema/….

Purplejacket 27.01.2021 23:06

@Purplejacket Замечательно, я обновил ссылку в ответе! :)

Juan 28.01.2021 17:55

Из спецификация:

By default, all types in GraphQL are nullable; the null value is a valid response for all of the above types. To declare a type that disallows null, the GraphQL Non‐Null type can be used. This type wraps an underlying type, and this type acts identically to that wrapped type, with the exception that null is not a valid response for the wrapping type. A trailing exclamation mark is used to denote a field that uses a Non‐Null type like this: name: String!.

Другими словами, типы в GraphQL по умолчанию допускают значение NULL. Восклицательный знак после типа специально обозначает этот тип как не допускающий значения NULL.

Это имеет разные последствия в зависимости от того, где используется тип.

Выход

Когда к типу поле применяется ненулевое значение, это означает, что если сервер разрешает это поле в null, ответ не пройдет проверку. Вы все равно можете получить частичный ответ, если ошибка не размножаются до корня.

Например, учитывая такую ​​схему:

type Query {
  user: User
}

type User {
  id: ID!
}

Здесь поле id не равно нулю. Помечая поле как ненулевое, мы фактически гарантия, мы никогда не вернем null для этого поля. Если сервер действительно возвращает значение null, это означает, что что-то пошло не так, и мы хотим выдать ошибку проверки.

Вход

Когда к типу Вход применяется ненулевое значение, такое как аргумент, поле входного объекта или переменная, он делает этот ввод обязательным. Например:

type Query {
  getUser(id: ID!, status: Status): User
}

Здесь аргумент id не равен нулю. Если мы запрашиваем поле getUser, нам всегда нужно будет предоставить для него аргумент id. С другой стороны, поскольку аргумент status допускает значение NULL, он необязателен и может быть опущен. Это относится и к переменным:

query MyQuery ($foo: ID!) {
  getUser(id: $foo)
}

Поскольку переменная $foo не имеет значения NULL, при отправке запроса ее нельзя пропустить, и ее значение не может равняться null.

Специальное примечание о типах переменных

Поскольку в нашем примере поле id является ненулевым типом ID (то есть ID!), любая передаваемая ему переменная должна быть также ненулевым ID. Если бы наша переменная $foo была обнуляемой ID, мы не смогли бы передать ее аргументу id. Однако обратное неверно. Если аргумент допускает значение NULL, вы может передаете ему ненулевую переменную.

Другими словами:

+----------+----------+--------+
| Argument | Variable | Valid? |
+----------+----------+--------+
| String   | String   |   ✅   |
| String   | String!  |   ✅   |
| String!  | String   |   ❌   |
| String!  | String!  |   ✅   |
+----------+----------+--------+

Другие вопросы по теме