При попытке автоматизировать добавление элемента в кешированный массив в Apollo Client после его создания с помощью мутации возникает ошибка TypeScript в строке 32 (data: {
):
Type '{ [x: string]: TFetchResultData[]; }' is not assignable to type 'TQuery'.
'{ [x: string]: TFetchResultData[]; }' is assignable to the constraint of type 'TQuery', but 'TQuery' could be instantiated with a different subtype of constraint 'Record<string, TFetchResultData[]>'.ts(2322)
DataProxy.d.ts(17, 9): The expected type comes from property 'data' which is declared here on type 'WriteQueryOptions<TQuery, TVariables>'
Вот полный код
import { ApolloCache, DataProxy } from '@apollo/client'
export const addToArray = <
TVariables,
TData,
TFetchResultData,
TQuery extends Record<string, TFetchResultData[]>,
K
>(
cache: ApolloCache<K>,
{
query,
variables,
fieldName,
newItem,
}: {
query: DataProxy.Query<TVariables, TData>['query']
variables: DataProxy.Query<TVariables, TData>['variables']
newItem: TFetchResultData
fieldName: keyof TQuery
}
): void => {
// Add to the documentFiles field, if it exists
const queryResult = cache.readQuery<TQuery, TVariables>({
query,
variables,
})
if (queryResult) {
cache.writeQuery<TQuery, TVariables>({
query,
variables,
data: {
[fieldName]: [...queryResult[fieldName], newItem],
},
})
}
}
Typescript жалуется, что у TQuery
могут быть дополнительные поля, которые будут удалены вашим кодом.
Добавьте ...queryResult
к вашему writeQuery
коду:
cache.writeQuery<TQuery, TVariables>({
query,
variables,
data: {
...queryResult,
[fieldName]: [...queryResult[fieldName], newItem],
},
})