From c6695f2e923b43dddcfe0298f3cd728b6757e0dd Mon Sep 17 00:00:00 2001 From: David Glasser Date: Thu, 16 Jul 2020 09:57:28 -0700 Subject: [PATCH] react: MutationResult.client is always set As far as I can tell, whenever a MutationResult is provided to the user of useMutation (or the component or HOC), it always contains a `client`; eg, OperationData.refreshClient checks this invariant. MutationResult is also used to type an internal state variable used by MutationData and useMutation; this one doesn't contain a `client`. This PR changes that variable to different type without `client`, and the actual exposed MutationResult now has a non-optional `client`. This makes it match `QueryResult`. Now TypeScript consumers of `useMutation` don't need to check to see if `client` exists before using it. --- src/react/data/MutationData.ts | 18 ++++++++++-------- src/react/types/types.ts | 4 ++-- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/react/data/MutationData.ts b/src/react/data/MutationData.ts index 88cd9d160d5..4f9cb33641f 100644 --- a/src/react/data/MutationData.ts +++ b/src/react/data/MutationData.ts @@ -6,20 +6,22 @@ import { MutationDataOptions, MutationTuple, MutationFunctionOptions, - MutationResult + MutationResult, } from '../types/types'; import { OperationData } from './OperationData'; import { OperationVariables } from '../../core/types'; import { FetchResult } from '../../link/core/types'; +type MutationResultWithoutClient = Omit, 'client'>; + export class MutationData< TData = any, TVariables = OperationVariables > extends OperationData { private mostRecentMutationId: number; - private result: MutationResult; - private previousResult?: MutationResult; - private setResult: (result: MutationResult) => any; + private result: MutationResultWithoutClient; + private previousResult?: MutationResultWithoutClient; + private setResult: (result: MutationResultWithoutClient) => any; constructor({ options, @@ -29,8 +31,8 @@ export class MutationData< }: { options: MutationDataOptions; context: any; - result: MutationResult; - setResult: (result: MutationResult) => any; + result: MutationResultWithoutClient; + setResult: (result: MutationResultWithoutClient) => any; }) { super(options, context); this.verifyDocumentType(options.mutation, DocumentType.Mutation); @@ -39,7 +41,7 @@ export class MutationData< this.mostRecentMutationId = 0; } - public execute(result: MutationResult) { + public execute(result: MutationResultWithoutClient): MutationTuple { this.isMounted = true; this.verifyDocumentType(this.getOptions().mutation, DocumentType.Mutation); return [ @@ -148,7 +150,7 @@ export class MutationData< return this.mostRecentMutationId === mutationId; } - private updateResult(result: MutationResult) { + private updateResult(result: MutationResultWithoutClient) { if ( this.isMounted && (!this.previousResult || !equal(this.previousResult, result)) diff --git a/src/react/types/types.ts b/src/react/types/types.ts index 0602bea4f77..e2e00cc85df 100644 --- a/src/react/types/types.ts +++ b/src/react/types/types.ts @@ -189,8 +189,8 @@ export interface MutationResult { error?: ApolloError; loading: boolean; called: boolean; - client?: ApolloClient; -} + client: ApolloClient; +}; export declare type MutationFunction< TData = any,