You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GraphQL中同一类型定义两个不同字段查询是否可行?需拆分类型吗?

结论

这种为同一个GraphQL类型定义多个请求不同字段的查询的做法是完全合规的,属于GraphQL的标准用法,你不需要额外拆分定义两个独立的类型或者处理器。

合理性说明
  • GraphQL的核心设计理念就是客户端按需请求字段,同一个类型支持不同的查询片段请求不同字段是原生支持的特性,不存在不合规的问题。
  • Apollo Client默认会基于__typename和id字段自动做缓存归一化,你两个查询返回的同一个Directory实例的数据会自动合并到缓存的同一条记录里,不会出现数据冗余或者冲突,你后续在任意组件里访问同一个Directory的children或者files字段都能直接从缓存拿到已经请求过的数据,不需要重复请求。
可选优化点

你当前的实现已经可以正常运行,如果你想要后续维护更方便,可以做以下调整:

  • 把两个查询中重复的Directory基础字段提取为公共片段,避免后续字段修改时要改两处:
fragment DirectoryBaseFields on Directory {
  name
  id
  parentId
  children
}

query getDirectory($id: String!) {
  directory(id: $id) {
    ...DirectoryBaseFields
  }
}
  • 给Apollo Client配置files字段的字段策略,告诉Apollo怎么合并多次分页拉取的files数据,避免新拉取的分页覆盖旧的内容,示例配置如下:
import { InMemoryCache } from '@apollo/client';

const cache = new InMemoryCache({
  typePolicies: {
    Directory: {
      fields: {
        files: {
          keyArgs: false,
          merge(existing = { items: [], after: null }, incoming) {
            return {
              ...incoming,
              items: [...existing.items, ...incoming.items],
            };
          },
        },
      },
    },
  },
});

内容的提问来源于stack exchange,提问作者Arsenowitch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 10:45:06