为什么要对GraphQL突变响应类型使用接口?

时间:2019-02-23 20:09:34

标签: javascript graphql apollo-server

在阅读Apollo Server文档时,建议对突变使用突变响应界面:

  

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

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

我了解界面在以下情况下的好处:用例中,您有一个事件界面,然后又有不同类型的事件,例如音乐会,会议等。我的理解是,该界面将使您例如,使用单个查询搜索所有事件,并返回多种类型的事件。

我很困惑为什么应该将一个接口用于突变反应,以及与标准反应类型相比有什么好处?

1 个答案:

答案 0 :(得分:3)

与联合一样,接口是一种抽象类型,它允许字段返回多种类型之一。根据规格:

  

当期望使用许多对象类型之一时,产生接口的字段很有用,但应保证某些字段。

但是,接口还强制实现类型具有一组特定的字段和参数。确切的规则可以在规范中找到here,但可以归结为:

  • 如果接口具有字段,则实现类型也必须具有该字段
  • 对于这些字段中的任何一个,实现类型还必须具有相同的参数(例如字段,它可以添加其他参数,但至少必须实现与接口相同的参数)
  • 这些必填字段和参数的类型必须与接口匹配
  • 如果必填字段或接口的类型为Non-Null,则在实现类型上也必须为Non-Null(尽管反之为非)

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

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

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

这些类型的定义一目了然-我们有codesuccessmessage的字段,以及与该响应相关的其他任何字段。但是,我们有一个类型,并且意外地使message上的UpdatePostMutationResponse字段为空。尽管这可能是无害的,但是如果我们确实在解析器中忽略了该消息,则可能直到后来才被忽略(希望在质量检查中,但可能在生产中!)。

但是,如果我们让这些类型实现MutationResponse接口,则可以确保即使有这样的不一致,我们的架构也不会建立。

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