为什么GraphQL片段在查询中需要__typename?

Bar*_*rry 9 apollo graphql apollo-client

我无法找到或者我在错误的地方查找有关片段如何匹配的任何文档.当我使用香草Apollo客户端如果我关闭addTypename我使用片段时的选项我得到一个警告heuristic fragment matching going on!,如果我添加它会消失,但我的回复包含许多__typename我不需要的字段.他们为什么帮忙?

bry*_*sgo 6

原因是ApolloClient与Relay一样,使用全局存储来缓存客户端上的数据.

为了做到这一点,需要全局ID.出于某种原因,全球ID并不是人们想到的,事实上,人们在转换到Relay时总是会抱怨.

ApolloClient有一个聪明的解决方案!(如果我错了,阿波罗团队会纠正我)他们允许您定义您的记录如何在商店中加入密钥!默认情况下,它使用typename和id来创建Relay建议您创建的全局ID类型.这就是他们需要typename的原因.

由于您要关闭查询中的typename,Apollo会做一些聪明的事情来尝试找出类型(以及商店中的密钥).这种聪明的东西会给你带来问题.

如果你想创建自己的全局id而不是使用所有这些智能东西,你可以像这样指定它:

const cache = new InMemoryCache({
  dataIdFromObject: object => object.key || null
});
Run Code Online (Sandbox Code Playgroud)

https://www.apollographql.com/docs/react/advanced/caching.html#normalization