在我发现的模式文件中,我注意到某些类型后面有感叹号,例如
# Information on an account relationship
type AccountEdge {
cursor: String!
node: Account!
}
这些是什么意思?我无法在文档中或通过谷歌搜索找到任何相关信息
答案 0 :(得分:22)
这意味着该字段不可为空。
中查看更多信息答案 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! | ✅ |
+----------+----------+--------+