Обновления Apollo Cache с проверкой нуля TypeScript - PullRequest
0 голосов
/ 15 ноября 2018

Я использую apollo codgen для генерации типов для моих запросов в GraphQL и использую TS. Я обнаружил, что сгенерированные типы содержат множество значений null, так что мой код становится тоннами if проверки. Так ли люди пишут свои обновления кэша graphql с помощью TS?

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

export interface ListContactsQuery_contacts_edges {
    __typename: "ContactEdge";
    /**
     * The item at the end of the edge.
     */
    node: ListContactsQuery_contacts_edges_node | null;
}
export interface ListContactsQuery_contacts {
    __typename: "ContactConnection";
    /**
     * A list of edges.
     */
    edges: (ListContactsQuery_contacts_edges | null)[] | null;
}
export interface ListContactsQuery {
    /**
     * Gets all contacts for the current user
     */
    contacts: ListContactsQuery_contacts;
}

1 Ответ

0 голосов
/ 09 июля 2019

Уже поздно, но все же кто-то может найти это полезным. Чтобы уменьшить количество нулевых проверок (или, точнее, количество 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);

Обратите внимание на все NonNullGraphType, указанные для типа возврата. ListGraphType<RoleType> => NonNullGraphType<ListGraphType<NonNullGraphType<RoleType>>>

...