graphql中的感叹号是什么?

时间:2018-06-04 15:39:47

标签: graphql

在我发现的模式文件中,我注意到某些类型后面有感叹号,例如

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

这些是什么意思?我无法在文档中或通过谷歌搜索找到任何相关信息

2 个答案:

答案 0 :(得分:22)

这意味着该字段不可为空。

Graphql - Schemas and Types

中查看更多信息

答案 1 :(得分:0)

来自spec

  

默认情况下,GraphQL中的所有类型都可以为空;空值是上述所有类型的有效响应。要声明不允许为null的类型,可以使用GraphQL Non-Null类型。此类型包装基础类型,并且此类型的行为与该包装类型相同,但null不是包装类型的有效响应。尾随的感叹号用于表示使用非null类型的字段,例如:name:String!。

换句话说,默认情况下GraphQL中的类型可以为空。类型后的感叹号专门将该类型指定为不可为空。

根据使用类型的不同,这会有不同的含义。

输出

当对字段的类型应用非null时,这意味着如果服务器将该字段解析为null,则响应将无法通过验证。只要错误不会propagate all the way up to the root,您仍可能会收到部分响应。

例如,给定类似这样的模式:

type Query {
  user: User
}

type User {
  id: ID!
}

此处id字段为非空。通过将字段标记为非空,我们有效地保证,我们将永远不会为该字段返回null。如果服务器确实返回null,则表明出现了严重错误,我们想抛出验证错误。

输入

将非空值应用于输入的类型(例如参数,输入对象字段或变量)时,将使该输入成为必需。例如:

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

此处,id参数为非null。如果我们请求getUser字段,则总是必须为其提供id参数。另一方面,由于status参数是可为空的,因此它是可选的,可以省略。这也适用于变量:

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!  |   ✅   |
+----------+----------+--------+