Javascript 为什么我应该为GraphQL突变响应类型使用接口?

Javascript 为什么我应该为GraphQL突变响应类型使用接口?,javascript,graphql,apollo-server,Javascript,Graphql,Apollo Server,在阅读Apollo Server文档时,建议对突变使用突变响应界面: 为了提供跨模式的一致性,我们建议 引入一个MutationResponse接口,可以在 模式中的每个突变响应都会启用事务 除正常突变反应外,还需返回的信息 反对 我理解接口对于用例的好处,在用例中,您有一个事件接口,然后您有不同类型的事件,如音乐会、会议等。我的理解是,接口允许您使用单个查询搜索所有事件,例如,返回多种类型的事件 我很困惑为什么一个接口应该用于突变反应,以及与标准反应类型相比有什么好处 与联合类似,接口是一种

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

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

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


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

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

当需要多种对象类型中的一种时,生成接口的字段是有用的,但某些字段应该得到保证

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

  • 如果接口有字段,则实现类型也必须有该字段
  • 实现类型还必须为这些字段中的任何字段具有相同的参数(与字段类似,它可以添加其他字段,但必须至少实现与接口相同的参数)
  • 这些必填字段和参数的类型必须与接口匹配
  • 如果所需字段或接口的类型为非Null,则在实现类型上也必须为非Null(尽管反过来不是真的)
通过创建一个接口并让多个类型实现它,您可以有效地创建一个安全网,帮助您确保跨相关类型的一致结构。假设我们实现了Apollo文档中建议的一些响应类型,没有接口:

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

type UpdatePostMutationResponse {
  code: String!
  success: Boolean!
  message: String
  post: Post
}
一目了然,这些类型的定义与我们的预期一致——我们有
code
success
message
字段,以及与该响应相关的任何其他字段。但是,我们有一个类型,并且意外地使
updatePostmentResponse
上的
message
字段为空。虽然这可能是无害的,但如果我们碰巧忽略了解析器中的消息,它可能会在以后才被注意到(希望是在QA期间,但可能是在生产中!)

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


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

我可以同意使用接口,正如您所说,作为“安全网”,以确保所有响应类型不丢失属性。谢谢你的回复碎片呢?如果使用了一个接口,那么根据我的理解,可以在接口上实现一个片段?是的,但只有当您的变异字段将接口作为返回类型而不是具体类型(即
MutationResponse
而不仅仅是
UpdateUserMutationResponse
)时,这才有效。这是可能的,但这也意味着你将有一个大片段在你所有的突变中共享。除了避免重复共享字段之外,我不知道这样做是否有必要获得任何好处。我创建了一个简单的类型
接口MutationResponse{status:Boolean!errors:[Error]}
所有的突变都使用该接口。在创建突变时,我在MutationResponse{…}上创建了一个片段
片段mutationResponseFields,该片段由。该片段适用于
MutationResponse
以及实现接口的类型。如果您创建一个片段来实现所有突变的MutationResponse,那将是为突变响应使用接口的另一个好处?当然。在我看来,拥有一个片段可能会降低前端代码的可读性。另一方面,您可以避免从一个突变中意外地忽略一个公共字段,如
status
errors
,因此这种方法有一些好处。