GraphQL中Input类型与Interface类型的区别是什么?
GraphQL Input类型与Interface类型的核心差异
这俩是完全不同的概念,作用场景完全不重叠,核心区别可以从这几个维度看:
1. 用途定位天差地别
- Input类型:纯纯的「输入参数容器」,专门用来给服务端传复杂数据——比如mutation里创建/更新资源的参数、query里的多条件筛选参数。它只能作为操作(query/mutation)的参数使用,绝对不能作为返回类型。
- Interface类型:是「抽象类型约定」,定义一组通用字段,让其他具体的Object类型去实现它。主要用于返回数据时,支持多态输出——比如一个
animals查询可以返回Dog、Cat等不同类型,但它们都遵循Animal接口的字段规范。
2. 语法和使用限制不同
Input类型示例
定义时用input关键字,内部只能嵌套标量、枚举或其他Input类型,不能包含Object/Interface类型,也没有字段解析逻辑:
input CreatePostInput { title: String! content: String! tags: [String] }
使用时作为mutation的参数:
mutation PublishPost($input: CreatePostInput!) { publishPost(input: $input) { id title } }
Interface类型示例
定义时用interface关键字,内部可以包含各种类型,字段可以有对应的解析函数;具体类型要通过implements实现接口:
interface Media { id: ID! title: String! createdAt: String! } type Video implements Media { id: ID! title: String! createdAt: String! duration: Int! } type Article implements Media { id: ID! title: String! createdAt: String! wordCount: Int! }
使用时作为返回类型,支持片段查询不同子类型的专属字段:
query GetMedia { media { id title ... on Video { duration } ... on Article { wordCount } } }
3. 设计目标不同
- Input类型是为了简化复杂输入的传递,把零散的参数打包成结构化的对象,提升API的可读性和复用性。
- Interface类型是为了实现类型抽象与多态,让API可以灵活返回不同但有共性的类型,同时保持类型系统的扩展性——比如后续新增
Audio类型,只要实现Media接口,就能直接加入media查询的返回结果里。
内容的提问来源于stack exchange,提问作者WebSurfer
相关产品推荐
相关产品推荐

