1

在阅读 Apollo Server 文档时,它建议对突变使用突变响应接口:

为了提供跨模式的一致性,我们建议引入一个MutationResponse接口,该接口可以在模式中的每个突变响应上实现,并且除了正常的突变响应对象之外,还可以返回事务信息。

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

我了解接口对于具有事件接口的用例的好处,然后您有不同类型的事件,例如音乐会、会议等。我的理解是一个接口将允许您使用单个查询搜索所有事件,例如,返回多种类型的事件。

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

4

1 回答 1

3

与联合一样,接口是一种抽象类型,它允许字段返回多种类型中的一种。从规范:

当需要多种 Object 类型中的一种时,产生接口的字段很有用,但应该保证某些字段。

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

  • 如果接口有字段,则实现类型也必须有该字段
  • 实现类型还必须对这些字段中的任何一个具有相同的参数(就像字段一样,它可以添加额外的参数,但必须至少实现与接口相同的参数)
  • 这些必填字段和参数的类型必须与接口匹配
  • 如果必填字段或接口的类型为 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
}

一目了然,这些类型是按照我们的意图定义的——我们有 、 和 的字段,code以及与该响应相关的任何其他字段。但是,我们有一个类型并且不小心使该字段可以为空。虽然这可能是无害的,但如果我们碰巧在解析器中省略了该消息,它可能会在很久以后才被注意到(希望在 QA 期间,但可能在生产中!)。successmessagemessageUpdatePostMutationResponse

但是,如果我们让这些类型实现了一个MutationResponse接口,我们可以确保我们的模式在出现任何此类不一致时甚至都不会构建。

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

于 2019-02-24T00:27:53.530 回答