在某些情况下,我有一个interface
,它具有在graphql中定义的不同的type
实现。我可能无法分享确切的代码。但是情况看起来像这样:
interface Character {
name: String!
}
type Human implements Character {
name: String!
friends: [Character]
}
type Droid implements Character {
name: String!
material: String
}
有查询返回Human
或Droid
类型作为响应。
响应可能包含以下内容:
{
name: 'Human_01',
friends: []
__typename: 'Human'
}
或
{
name: 'Droid_01',
material: 'Aluminium'
__typename: 'Droid'
}
我正在客户端使用Apollo Client 3来查询数据,并具有以下片段:
fragment Human on Human {
friends
}
fragment Droid on Droid {
material
}
fragment Character on Character {
name
...Human
...Droid
}
我要查询的Character
数据是:
character {
...Character
}
既然是interface
的情况,并且如Apollo客户端3的文档中所定义,我们需要使用possibleTypes
来匹配这种情况下的片段。出于缓存目的,我将InMemoryCache定义为:
new InMemoryCache({ possibleTypes: { Character: ['Human', 'Droid'] } })
Character
实现的主键字段是name
字段,我需要使用它来将其值存储在缓存中。
在Apollo客户端3中,提到使用typePolicies
来为类型定义keyFields
。
因此,我需要询问是否应该为两种类型的实现定义类型策略,在两种情况下都将keyFields
指定为name
,
new InMemoryCache({
possibleTypes: { Character: ['Human', 'Droid'] },
typePolicies: { Human: { keyFields: ['name'] }, Droid: { keyFields: ['name'] } }
});
在我的示例中,我仅提供了2种这样的类型实现,但是可以有n
个与Character
接口相对应的类型实现。因此,在这种情况下,对于所有keyFields
类型的实现,我都需要在name
中将typePolicies
定义为n
。
那么,使用这些interface
实现类型的缓存是否有更好的方法呢?
任何帮助将不胜感激。谢谢!!!
答案 0 :(得分:1)
Inheritance of type and field policies即将在@apollo/client
v3.3的下一个次要版本中发布!
您现在可以通过安装@apollo/client@3.3.0-beta.5
来试用。
要及时了解v3.3版本的最新进展,请参见this pull request。