在我发现的模式文件中,我注意到某些类型后面有感叹号,例如
# Information on an account relationship
type AccountEdge {
cursor: String!
node: Account!
}
Run Code Online (Sandbox Code Playgroud)
这些是什么意思?我在文档中或通过谷歌搜索找不到任何相关内容
Dan*_*den 38
从规范:
默认情况下,GraphQL 中的所有类型都是可为空的;空值是上述所有类型的有效响应。要声明不允许 null 的类型,可以使用 GraphQL Non?Null 类型。此类型包装基础类型,并且此类型的行为与该包装类型相同,但 null 不是包装类型的有效响应。尾随感叹号用于表示使用 Non?Null 类型的字段,如下所示:name: String!。
换句话说,GraphQL 中的类型默认可以为空。类型后的感叹号专门指定该类型为不可为空。
这具有不同的含义,具体取决于使用类型的位置。
当非空应用于字段的类型时,这意味着如果服务器将该字段解析为null,则响应将无法通过验证。您可能仍会收到部分响应,只要错误不会一直传播到 root。
例如,给定一个架构,如:
type Query {
user: User
}
type User {
id: ID!
}
Run Code Online (Sandbox Code Playgroud)
这里的id字段是非空的。通过将字段标记为非空,我们有效地保证我们永远不会为此字段返回空。如果服务器确实返回 null,则表明出现了严重错误并且我们想要抛出验证错误。
当 non-null 应用于input的类型时,例如参数、输入对象字段或变量,它会使该输入成为必需的。例如:
type Query {
getUser(id: ID!, status: Status): User
}
Run Code Online (Sandbox Code Playgroud)
在这里,id参数是非空的。如果我们请求该getUser字段,我们将始终必须为其提供id参数。另一方面,因为status参数可以为空,所以它是可选的并且可以省略。这也适用于变量:
query MyQuery ($foo: ID!) {
getUser(id: $foo)
}
Run Code Online (Sandbox Code Playgroud)
因为$foo变量是非空的,所以当你发送查询时,它不能被省略,它的值不能等于null。
由于该id领域是一个非空ID(即ID!在我们的例子)类型,我们传递给它的变量都必须也有一个非空ID。如果我们的$foo变量是可空的ID,我们就不能将它传递给id参数。然而,事实并非如此。如果参数可以为空,则可以将其传递给非空变量。
换句话说:
+----------+----------+--------+
| Argument | Variable | Valid? |
+----------+----------+--------+
| String | String | ? |
| String | String! | ? |
| String! | String | ? |
| String! | String! | ? |
+----------+----------+--------+
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6276 次 |
| 最近记录: |