使用TypeScript空检查的Apollo缓存更新

时间:2018-11-15 15:52:13

标签: typescript graphql apollo apollo-client

我正在使用apollo codgen为我的graphql查询生成类型,并使用TS,发现生成的类型中包含许多null值,因此我的代码变成了{{ 1}}检查。人们是用TS编写他们的graphql缓存更新的方式吗?

if

这感觉很不对,在我知道this.props.mutate({ variables, update: (proxy, { data }) => { // nulls all the way down so guarding against them with early return if (!data || !data.createContact || !data.createContact.contact) return; let newContactEdge = { node: { ...data.createContact.contact, __typename: 'Contact' }, __typename: 'ContactEdge', }; // read from cache let listCache = proxy.readQuery<ListContactsQuery>({ query: ChatAPI.queries.listContacts }); // again nulls all the way down if (listCache && listCache.contacts && listCache.contacts.edges) { proxy.writeQuery({ query: ChatAPI.queries.listContacts, data: { ...listCache, contacts: { ...listCache.contacts, edges: [newContactEdge, ...listCache.contacts.edges], }, }, }); } }, }) 是否不为空之前,数据就已经存在了,而不必一直检查下去。

作为参考,以下是该cache

的生成类型
ListContactsQuery

1 个答案:

答案 0 :(得分:0)

有点晚了,但仍然有人会觉得它有用。为了减少客户端上的空检查数量(或更确切地说,Maybe<>类型的数量),您必须适当地设置服务器端模式。例如。在GraphQL .net中:

    Field<ListGraphType<RoleType>>()
            .Name(QueryName.Roles)
            .Resolve(context => AuthRoleRepo.LoadAllAuthRoles())
            .RequirePermission(Const.Roles.Admin);

成为

    Field<NonNullGraphType<ListGraphType<NonNullGraphType<RoleType>>>>()
            .Name(QueryName.Roles)
            .Resolve(context => AuthRoleRepo.LoadAllAuthRoles())
            .RequirePermission(Const.Roles.Admin);

请注意为返回类型指定的所有NonNullGraphTypeListGraphType<RoleType> => NonNullGraphType<ListGraphType<NonNullGraphType<RoleType>>>