【发布时间】:2018-11-14 00:06:26
【问题描述】:
在我的架构文件中,我注意到某些类型后面有感叹号,例如
# Information on an account relationship
type AccountEdge {
cursor: String!
node: Account!
}
这些是什么意思?我在文档中或通过谷歌搜索找不到任何关于它的信息????
【问题讨论】:
标签: graphql
在我的架构文件中,我注意到某些类型后面有感叹号,例如
# Information on an account relationship
type AccountEdge {
cursor: String!
node: Account!
}
这些是什么意思?我在文档中或通过谷歌搜索找不到任何关于它的信息????
【问题讨论】:
标签: graphql
这意味着该字段不可为空。
在Graphql - Schemas and Types查看更多信息
【讨论】:
来自spec:
默认情况下,GraphQL 中的所有类型都可以为空; null 值是所有上述类型的有效响应。要声明不允许 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 参数不为空。如果我们请求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! | ✅ |
+----------+----------+--------+
【讨论】: