为什么我应该将接口用于GraphQl突变响应类型



在读取Apollo服务器文档时,它建议使用突变响应接口进行突变:

为了提供整个模式的一致性,我们建议 引入MutationResponse接口,可以在 模式中的每个突变响应并启用交易 除正常突变响应外还需要返回的信息 对象。

https://www.apollographql.com/docs/apollo-server/essentials/schema.html

我了解您拥有事件接口的用例中的接口的好处例如,使用单个查询搜索所有事件,请返回多种类型的事件。

我很困惑为什么应该将接口用于突变响应?与标准响应类型的好处是什么?

像一个联合一样,接口是一种抽象类型,允许字段返回多种类型之一。从规格:

产生接口的字段在预期的许多对象类型之一中很有用,但是应保证某些字段。

但是,接口还迫使实施类型具有特定的字段和参数。确切的规则可以在规格中找到,但归结为:

  • 如果接口具有字段,则实现类型也必须具有该字段
  • 实现类型也必须针对这些字段中的任何一个具有相同的参数(例如字段,它可以添加其他字段,但至少必须与接口实现相同的参数)
  • 这些必需字段和参数的类型必须匹配接口
  • 如果所需字段或接口的类型是非空的,则它在实现类型上也必须是非null(尽管相反的不正确)

通过创建接口并使多种类型实现它,您可以有效地创建一个安全网,以帮助您确保相关类型的结构一致。假设我们按照Apollo文档中建议的一些响应类型,而没有接口:

type UpdateUserMutationResponse {
  code: String!
  success: Boolean!
  message: String!
  user: User
}
type UpdatePostMutationResponse {
  code: String!
  success: Boolean!
  message: String
  post: Post
}

一目了然,这些类型是根据我们的预期定义的 - 我们有codesuccessmessage的字段,以及与该响应有关的任何其他字段。但是,我们有一种类型,并在UpdatePostMutationResponse上无意中使message字段无效。虽然这可能是无害的,但如果我们确实碰巧省略了解决方案中的信息,但它可能不会引起人们的注意,直到以后(希望在QA期间,但也许在生产中!)。

如果我们有这些类型实现MutationResponse接口,则可以确保如果有任何不一致之处,我们的模式甚至不会构建。

以这种方式,即使我们从不利用MutationResponse作为字段的返回类型,我们仍然可以从使用接口中受益。

最新更新