与联合一样,接口是一种抽象类型,它允许字段返回多种类型中的一种。从规范:
当需要多种 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作为字段的返回类型,我们仍然可以从使用接口中受益。