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

如何为REST来源的JSON添加__typename适配Apollo Client GraphQL查询?

解决Apollo Client自动为嵌套对象添加__typename的问题

你遇到的核心问题是Apollo Client默认的addTypename: true只会给顶层对象添加__typename,嵌套的子对象不会自动处理,导致缓存读取时嵌套的summary因为缺少类型标识被解析为空。下面是几种靠谱的自动添加方案:

方案1:写入缓存时用transform函数手动补全嵌套__typename

在调用cache.writeQuery或通过Apollo Client写入数据时,自定义一个转换函数遍历数据结构,给每个嵌套对象加上对应GraphQL Schema里的类型名(比如RatingSummary)。

示例代码:

// 假设你的GraphQL类型是Rating(根)和RatingSummary(嵌套的summary)
const addTypenamesToRatingData = (data) => {
  if (!data) return data;
  return {
    ...data,
    __typename: 'Rating',
    summary: {
      ...data.summary,
      __typename: 'RatingSummary'
    }
  };
};

// 写入缓存时使用转换后的 data
cache.writeQuery({
  query: RatingQuery,
  data: addTypenamesToRatingData(ratingDataWithoutTypename),
});

如果有多层嵌套,可以写一个递归函数批量处理所有对象。

方案2:配置TypePolicy让Apollo自动识别嵌套类型

在Apollo Client的缓存配置里添加typePolicies,明确指定嵌套字段对应的GraphQL类型,这样Apollo在写入时会自动给这些嵌套对象加上__typename。

示例代码:

const client = new ApolloClient({
  uri: '/graphql',
  cache: new InMemoryCache({
    addTypename: true,
    typePolicies: {
      Rating: {
        fields: {
          summary: {
            merge(existing, incoming) {
              // 写入时自动给summary补全__typename
              return { ...incoming, __typename: 'RatingSummary' };
            }
          }
        }
      }
    }
  })
});

这种方式一劳永逸,后续所有写入Rating类型的数据,嵌套的summary都会自动带上正确的__typename。

如果你的REST API是通过apollo-link-rest接入的,可以在配置中直接指定每个端点返回的类型,link会自动给所有层级的对象加上对应的__typename。

示例代码:

import { RestLink } from 'apollo-link-rest';

const restLink = new RestLink({
  uri: '/api/',
  endpoints: {
    getRatings: {
      path: 'ratings/:id',
      responseTransformer: (response) => {
        response.__typename = 'Rating';
        response.summary.__typename = 'RatingSummary';
        return response;
      }
    }
  }
});

这种方式适合直接从REST API获取数据后存入Apollo缓存的场景,不需要额外手动处理。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 17:25:03