Я использую 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;
}