Skip to content
tRPC

useUtils

On this page

useUtils is a hook that gives you access to helpers that let you manage the cached data of the queries you execute via @trpc/react-query. These helpers are actually thin wrappers around @tanstack/react-query's queryClient methods. If you want more in-depth information about options and usage patterns for useUtils helpers than what we provide here, we will link to their respective @tanstack/react-query docs so you can refer to them accordingly.

Usage

useUtils returns an object with all the available queries you have in your routers. You use it the same way as your trpc client object. Once you reach a query, you'll have access to the query helpers. For example, let's say you have a post router with an all query:

server.ts
import { const initTRPC: TRPCBuilder<object, object>initTRPC } from '@trpc/server';
import { import zz } from 'zod';

const 
const t: TRPCRootObject<object, object, RuntimeConfigOptions<object, object>, {
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}>
t
= const initTRPC: TRPCBuilder<object, object>initTRPC.
TRPCBuilder<object, object>.create<RuntimeConfigOptions<object, object>>(opts?: RuntimeConfigOptions<object, object> | undefined): TRPCRootObject<object, object, RuntimeConfigOptions<object, object>, {
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}>
create
();
const
const appRouter: BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    post: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        all: QueryProcedure<{
            input: void;
            output: {
                posts: {
                    id: number;
                    title: string;
                }[];
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
    }>>;
}>>
appRouter
=
const t: TRPCRootObject<object, object, RuntimeConfigOptions<object, object>, {
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}>
t
.
TRPCRootObject<object, object, RuntimeConfigOptions<object, object>, { ctx: object; meta: object; errorShape: DefaultErrorShape; transformer: false; }>.router: RouterBuilder
<{
    post: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        all: QueryProcedure<{
            input: void;
            output: {
                posts: {
                    id: number;
                    title: string;
                }[];
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
    }>>;
}>(_: {
    post: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        all: QueryProcedure<{
            input: void;
            output: {
                posts: {
                    id: number;
                    title: string;
                }[];
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
    }>>;
}) => BuiltRouter<...>
router
({
post: BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    all: QueryProcedure<{
        input: void;
        output: {
            posts: {
                id: number;
                title: string;
            }[];
        };
        meta: object;
        errorShape: DefaultErrorShape;
    }>;
}>>
post
:
const t: TRPCRootObject<object, object, RuntimeConfigOptions<object, object>, {
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}>
t
.
TRPCRootObject<object, object, RuntimeConfigOptions<object, object>, { ctx: object; meta: object; errorShape: DefaultErrorShape; transformer: false; }>.router: RouterBuilder
<{
    all: QueryProcedure<{
        input: void;
        output: {
            posts: {
                id: number;
                title: string;
            }[];
        };
        meta: object;
        errorShape: DefaultErrorShape;
    }>;
}>(_: {
    all: QueryProcedure<{
        input: void;
        output: {
            posts: {
                id: number;
                title: string;
            }[];
        };
        meta: object;
        errorShape: DefaultErrorShape;
    }>;
}) => BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    all: QueryProcedure<{
        input: void;
        output: {
            posts: {
                id: number;
                title: string;
            }[];
        };
        meta: object;
        errorShape: DefaultErrorShape;
    }>;
}>>
router
({
all: QueryProcedure<{
    input: void;
    output: {
        posts: {
            id: number;
            title: string;
        }[];
    };
    meta: object;
    errorShape: DefaultErrorShape;
}>
all
:
const t: TRPCRootObject<object, object, RuntimeConfigOptions<object, object>, {
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}>
t
.TRPCRootObject<object, object, RuntimeConfigOptions<object, object>, { ctx: object; meta: object; errorShape: DefaultErrorShape; transformer: false; }>.procedure: ProcedureBuilder<object, object, object, UnsetMarker, UnsetMarker, UnsetMarker, UnsetMarker, false, DefaultErrorShape>procedure.
ProcedureBuilder<object, object, object, UnsetMarker, UnsetMarker, UnsetMarker, UnsetMarker, false, DefaultErrorShape>.query<{
    posts: {
        id: number;
        title: string;
    }[];
}>(resolver: ProcedureResolver<object, object, object, UnsetMarker, UnsetMarker, {
    posts: {
        id: number;
        title: string;
    }[];
}>): QueryProcedure<{
    input: void;
    output: {
        posts: {
            id: number;
            title: string;
        }[];
    };
    meta: object;
    errorShape: DefaultErrorShape;
}>
query
(() => {
return {
posts: {
    id: number;
    title: string;
}[]
posts
: [
{ id: numberid: 1, title: stringtitle: 'everlong' }, { id: numberid: 2, title: stringtitle: 'After Dark' }, ], }; }), }), }); export type
type AppRouter = Router<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    post: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        all: QueryProcedure<{
            input: void;
            output: {
                posts: {
                    id: number;
                    title: string;
                }[];
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
    }>>;
}>> & DecorateCreateRouterOptions<{
    post: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        all: QueryProcedure<{
            input: void;
            output: {
                posts: {
                    id: number;
                    title: string;
                }[];
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
    }>>;
}>
AppRouter
= typeof
const appRouter: BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    post: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        all: QueryProcedure<{
            input: void;
            output: {
                posts: {
                    id: number;
                    title: string;
                }[];
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
    }>>;
}>>
appRouter
;

Now in our component, when we navigate the object useUtils gives us and reach the post.all query, we'll get access to our query helpers!

MyComponent.tsx
import { function createTRPCReact<TRouter extends AnyRouter, TSSRContext = unknown>(opts?: CreateTRPCReactOptions<TRouter>): CreateTRPCReact<TRouter, TSSRContext>createTRPCReact } from '@trpc/react-query';
import type { 
type AppRouter = Router<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    post: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        all: QueryProcedure<{
            input: void;
            output: {
                posts: {
                    id: number;
                    title: string;
                }[];
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
    }>>;
}>> & DecorateCreateRouterOptions<{
    post: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        all: QueryProcedure<{
            input: void;
            output: {
                posts: {
                    id: number;
                    title: string;
                }[];
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
    }>>;
}>
AppRouter
} from './server';
const
const trpc: CreateTRPCReactBase<BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    post: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        all: QueryProcedure<{
            input: void;
            output: {
                posts: {
                    id: number;
                    title: string;
                }[];
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
    }>>;
}>>, unknown> & DecorateRouterRecord<...>
trpc
=
createTRPCReact<BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    post: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        all: QueryProcedure<{
            input: void;
            output: {
                posts: {
                    id: number;
                    title: string;
                }[];
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
    }>>;
}>>, unknown>(opts?: CreateTRPCReactOptions<...> | undefined): CreateTRPCReactBase<...> & DecorateRouterRecord<...>
createTRPCReact
<
type AppRouter = Router<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    post: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        all: QueryProcedure<{
            input: void;
            output: {
                posts: {
                    id: number;
                    title: string;
                }[];
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
    }>>;
}>> & DecorateCreateRouterOptions<{
    post: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        all: QueryProcedure<{
            input: void;
            output: {
                posts: {
                    id: number;
                    title: string;
                }[];
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
    }>>;
}>
AppRouter
>();
function function MyComponent(): voidMyComponent() { const
const utils: TRPCContextPropsBase<BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    post: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        all: QueryProcedure<{
            input: void;
            output: {
                posts: {
                    id: number;
                    title: string;
                }[];
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
    }>>;
}>>, unknown> & {
    ...;
} & DecorateRouter & {
    ...;
}
utils
=
const trpc: CreateTRPCReactBase<BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    post: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        all: QueryProcedure<{
            input: void;
            output: {
                posts: {
                    id: number;
                    title: string;
                }[];
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
    }>>;
}>>, unknown> & DecorateRouterRecord<...>
trpc
.
function useUtils(): TRPCContextPropsBase<BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    post: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        all: QueryProcedure<{
            input: void;
            output: {
                posts: {
                    id: number;
                    title: string;
                }[];
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
    }>>;
}>>, unknown> & {
    ...;
} & DecorateRouter & {
    ...;
}
useUtils
();
const utils: TRPCContextPropsBase<BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    post: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        all: QueryProcedure<{
            input: void;
            output: {
                posts: {
                    id: number;
                    title: string;
                }[];
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
    }>>;
}>>, unknown> & {
    ...;
} & DecorateRouter & {
    ...;
}
utils
.
post: DecorateRouter & {
    all: DecorateQueryProcedure<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, QueryProcedure<{
        input: void;
        output: {
            posts: {
                id: number;
                title: string;
            }[];
        };
        meta: object;
        errorShape: DefaultErrorShape;
    }>>;
}
post
.
all: DecorateQueryProcedure<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, QueryProcedure<{
    input: void;
    output: {
        posts: {
            id: number;
            title: string;
        }[];
    };
    meta: object;
    errorShape: DefaultErrorShape;
}>>
all
.f
  • fetch
  • fetchInfinite
;
Property 'f' does not exist on type 'DecorateQueryProcedure<{ ctx: object; meta: object; errorShape: DefaultErrorShape; transformer: false; }, QueryProcedure<{ input: void; output: { posts: { id: number; title: string; }[]; }; meta: object; errorShape: DefaultErrorShape; }>>'.
}

Helpers

These are the helpers you'll get access to via useUtils. The table below will help you know which tRPC helper wraps which @tanstack/react-query helper method. Each react-query method will link to its respective docs/guide:

tRPC helper wrapper@tanstack/react-query helper method
fetchqueryClient.fetchQuery
prefetchqueryClient.prefetchQuery
fetchInfinitequeryClient.fetchInfiniteQuery
prefetchInfinitequeryClient.prefetchInfiniteQuery
ensureDataqueryClient.ensureData
invalidatequeryClient.invalidateQueries
refetchqueryClient.refetchQueries
cancelqueryClient.cancelQueries
setDataqueryClient.setQueryData
setQueriesDataqueryClient.setQueriesData
getDataqueryClient.getQueryData
setInfiniteDataqueryClient.setInfiniteQueryData
getInfiniteDataqueryClient.getInfiniteData
setMutationDefaultsqueryClient.setMutationDefaults
getMutationDefaultsqueryClient.getMutationDefaults
isMutatingqueryClient.isMutating
resetqueryClient.resetQueries

❓ The function I want isn't here!

@tanstack/react-query has a lot of functions that we haven't put in the tRPC context yet. If you need a function that isn't here, feel free to open a feature request requesting it.

In the meantime, you can import and use the function directly from @tanstack/react-query. We also provide a getQueryKey which you can use to get the correct queryKey on the filters when using these functions.

Proxy client

In addition to the above react-query helpers, the context also exposes your tRPC proxy client. This lets you call your procedures with async/await without needing to create an additional vanilla client.

import { function useState<S>(initialState: S | (() => S)): [S, React.Dispatch<React.SetStateAction<S>>] (+1 overload)useState } from 'react';
import { 
const trpc: CreateTRPCReactBase<BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    apiKey: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        create: MutationProcedure<{
            input: void;
            output: string;
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
    }>>;
}>>, unknown> & DecorateRouterRecord<...>
trpc
} from './utils/trpc';
function function MyComponent(): React.JSX.ElementMyComponent() { const [const apiKey: stringapiKey, const setApiKey: React.Dispatch<React.SetStateAction<string>>setApiKey] = useState<string>(initialState: string | (() => string)): [string, React.Dispatch<React.SetStateAction<string>>] (+1 overload)useState(''); const
const utils: TRPCContextPropsBase<BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    apiKey: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        create: MutationProcedure<{
            input: void;
            output: string;
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
    }>>;
}>>, unknown> & {
    ...;
} & DecorateRouter & {
    ...;
}
utils
=
const trpc: CreateTRPCReactBase<BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    apiKey: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        create: MutationProcedure<{
            input: void;
            output: string;
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
    }>>;
}>>, unknown> & DecorateRouterRecord<...>
trpc
.
function useUtils(): TRPCContextPropsBase<BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    apiKey: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        create: MutationProcedure<{
            input: void;
            output: string;
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
    }>>;
}>>, unknown> & {
    ...;
} & DecorateRouter & {
    ...;
}
useUtils
();
return ( <React.JSX.IntrinsicElements.form: React.DetailedHTMLProps<React.FormHTMLAttributes<HTMLFormElement>, HTMLFormElement>form React.DOMAttributes<HTMLFormElement>.onSubmit?: React.SubmitEventHandler<HTMLFormElement> | undefinedonSubmit={async (event: React.SubmitEvent<HTMLFormElement>event) => { const const apiKey: stringapiKey = await
const utils: TRPCContextPropsBase<BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    apiKey: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        create: MutationProcedure<{
            input: void;
            output: string;
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
    }>>;
}>>, unknown> & {
    ...;
} & DecorateRouter & {
    ...;
}
utils
.
client: TRPCUntypedClient<BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    apiKey: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        create: MutationProcedure<{
            input: void;
            output: string;
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
    }>>;
}>>> & DecoratedProcedureRecord<...> & {
    ...;
}
client
.
apiKey: DecoratedProcedureRecord<{
    transformer: false;
    errorShape: DefaultErrorShape;
}, DecorateCreateRouterOptions<{
    create: MutationProcedure<{
        input: void;
        output: string;
        meta: object;
        errorShape: DefaultErrorShape;
    }>;
}>>
apiKey
.
create: {
    mutate: Resolver<{
        input: void;
        output: string;
        errorShape: DefaultErrorShape;
        transformer: false;
    }>;
}
create
.mutate: (input: void, opts?: TRPCProcedureOptions) => TRPCTaggedPromise<string, DefaultErrorShape>mutate();
const setApiKey: (value: React.SetStateAction<string>) => voidsetApiKey(const apiKey: stringapiKey); }} > {/* form content */} </React.JSX.IntrinsicElements.form: React.DetailedHTMLProps<React.FormHTMLAttributes<HTMLFormElement>, HTMLFormElement>form> ); }

Query Invalidation

You invalidate queries via the invalidate helper. invalidate is actually a special helper given that, unlike the other helpers, it's available at every level of the router map. This means you can either run invalidate on a single query, a whole router, or every router if you want. We get more in detail in the sections below.

Invalidating a single query

You can invalidate a query relating to a single procedure and even filter based on the input passed to it to prevent unnecessary calls to the back end.

Example code

import { 
const trpc: CreateTRPCReactBase<BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    post: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        all: QueryProcedure<{
            input: void;
            output: {
                posts: {
                    id: number;
                    title: string;
                }[];
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        byId: QueryProcedure<{
            input: {
                id: number;
            };
            output: {
                post: {
                    id: number;
                    title: string;
                };
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        edit: MutationProcedure<{
            input: {
                ...;
            };
            output: {
                ...;
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
    }>>;
}>>, unknown> & DecorateRouterRecord<...>
trpc
} from './utils/trpc';
function function MyComponent(): voidMyComponent() { const
const utils: TRPCContextPropsBase<BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    post: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        all: QueryProcedure<{
            input: void;
            output: {
                posts: {
                    id: number;
                    title: string;
                }[];
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        byId: QueryProcedure<{
            input: {
                id: number;
            };
            output: {
                post: {
                    id: number;
                    title: string;
                };
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        edit: MutationProcedure<{
            input: {
                ...;
            };
            output: {
                ...;
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
    }>>;
}>>, unknown> & {
    ...;
} & DecorateRouter & {
    ...;
}
utils
=
const trpc: CreateTRPCReactBase<BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    post: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        all: QueryProcedure<{
            input: void;
            output: {
                posts: {
                    id: number;
                    title: string;
                }[];
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        byId: QueryProcedure<{
            input: {
                id: number;
            };
            output: {
                post: {
                    id: number;
                    title: string;
                };
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        edit: MutationProcedure<{
            input: {
                ...;
            };
            output: {
                ...;
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
    }>>;
}>>, unknown> & DecorateRouterRecord<...>
trpc
.
function useUtils(): TRPCContextPropsBase<BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    post: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        all: QueryProcedure<{
            input: void;
            output: {
                posts: {
                    id: number;
                    title: string;
                }[];
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        byId: QueryProcedure<{
            input: {
                id: number;
            };
            output: {
                post: {
                    id: number;
                    title: string;
                };
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        edit: MutationProcedure<{
            input: {
                ...;
            };
            output: {
                ...;
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
    }>>;
}>>, unknown> & {
    ...;
} & DecorateRouter & {
    ...;
}
useUtils
();
const
const mutation: UseTRPCMutationResult<{
    id: number;
    title: string;
}, TRPCClientErrorLike<{
    input: {
        ...;
    };
    output: {
        ...;
    };
    transformer: false;
    errorShape: DefaultErrorShape;
}>, {
    ...;
}, unknown>
mutation
=
const trpc: CreateTRPCReactBase<BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    post: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        all: QueryProcedure<{
            input: void;
            output: {
                posts: {
                    id: number;
                    title: string;
                }[];
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        byId: QueryProcedure<{
            input: {
                id: number;
            };
            output: {
                post: {
                    id: number;
                    title: string;
                };
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        edit: MutationProcedure<{
            input: {
                ...;
            };
            output: {
                ...;
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
    }>>;
}>>, unknown> & DecorateRouterRecord<...>
trpc
.
post: DecorateRouterRecord<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    all: QueryProcedure<{
        input: void;
        output: {
            posts: {
                id: number;
                title: string;
            }[];
        };
        meta: object;
        errorShape: DefaultErrorShape;
    }>;
    byId: QueryProcedure<{
        input: {
            id: number;
        };
        output: {
            post: {
                id: number;
                title: string;
            };
        };
        meta: object;
        errorShape: DefaultErrorShape;
    }>;
    edit: MutationProcedure<{
        input: {
            ...;
        };
        output: {
            ...;
        };
        meta: object;
        errorShape: DefaultErrorShape;
    }>;
}>>
post
.
edit: DecoratedMutation<{
    input: {
        ...;
    };
    output: {
        ...;
    };
    transformer: false;
    errorShape: DefaultErrorShape;
}>
edit
.
useMutation: <unknown>(opts?: UseTRPCMutationOptions<{
    id: number;
    title: string;
}, TRPCClientErrorLike<{
    input: {
        id: number;
        title: string;
    };
    output: {
        id: number;
        title: string;
    };
    transformer: false;
    errorShape: DefaultErrorShape;
}>, {
    id: number;
    title: string;
}, unknown> | undefined) => UseTRPCMutationResult<{
    id: number;
    title: string;
}, TRPCClientErrorLike<{
    input: {
        id: number;
        title: string;
    };
    output: {
        id: number;
        title: string;
    };
    transformer: false;
    errorShape: DefaultErrorShape;
}>, {
    id: number;
    title: string;
}, unknown>
useMutation
({
onSuccess?: ((data: {
    id: number;
    title: string;
}, variables: {
    id: number;
    title: string;
}, onMutateResult: unknown, context: MutationFunctionContext) => Promise<unknown> | unknown) | undefined
onSuccess
(
input: {
    id: number;
    title: string;
}
input
) {
const utils: TRPCContextPropsBase<BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    post: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        all: QueryProcedure<{
            input: void;
            output: {
                posts: {
                    id: number;
                    title: string;
                }[];
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        byId: QueryProcedure<{
            input: {
                id: number;
            };
            output: {
                post: {
                    id: number;
                    title: string;
                };
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        edit: MutationProcedure<{
            input: {
                ...;
            };
            output: {
                ...;
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
    }>>;
}>>, unknown> & {
    ...;
} & DecorateRouter & {
    ...;
}
utils
.
post: DecorateRouter & {
    all: DecorateQueryProcedure<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, QueryProcedure<{
        input: void;
        output: {
            posts: {
                id: number;
                title: string;
            }[];
        };
        meta: object;
        errorShape: DefaultErrorShape;
    }>>;
    byId: DecorateQueryProcedure<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, QueryProcedure<{
        input: {
            id: number;
        };
        output: {
            post: {
                id: number;
                title: string;
            };
        };
        meta: object;
        errorShape: DefaultErrorShape;
    }>>;
    edit: DecorateMutationProcedure<...>;
}
post
.
all: DecorateQueryProcedure<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, QueryProcedure<{
    input: void;
    output: {
        posts: {
            id: number;
            title: string;
        }[];
    };
    meta: object;
    errorShape: DefaultErrorShape;
}>>
all
.
function invalidate(input?: void | undefined, filters?: (Omit<InvalidateQueryFilters<readonly unknown[]>, "predicate"> & {
    predicate?: ((query: Query<{
        posts: {
            id: number;
            title: string;
        }[];
    }, TRPCClientError<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }>, {
        posts: {
            id: number;
            title: string;
        }[];
    }, QueryKeyKnown<void, "infinite">>) => boolean) | undefined;
}) | undefined, options?: InvalidateOptions): Promise<void>
invalidate
();
const utils: TRPCContextPropsBase<BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    post: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        all: QueryProcedure<{
            input: void;
            output: {
                posts: {
                    id: number;
                    title: string;
                }[];
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        byId: QueryProcedure<{
            input: {
                id: number;
            };
            output: {
                post: {
                    id: number;
                    title: string;
                };
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        edit: MutationProcedure<{
            input: {
                ...;
            };
            output: {
                ...;
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
    }>>;
}>>, unknown> & {
    ...;
} & DecorateRouter & {
    ...;
}
utils
.
post: DecorateRouter & {
    all: DecorateQueryProcedure<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, QueryProcedure<{
        input: void;
        output: {
            posts: {
                id: number;
                title: string;
            }[];
        };
        meta: object;
        errorShape: DefaultErrorShape;
    }>>;
    byId: DecorateQueryProcedure<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, QueryProcedure<{
        input: {
            id: number;
        };
        output: {
            post: {
                id: number;
                title: string;
            };
        };
        meta: object;
        errorShape: DefaultErrorShape;
    }>>;
    edit: DecorateMutationProcedure<...>;
}
post
.
byId: DecorateQueryProcedure<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, QueryProcedure<{
    input: {
        id: number;
    };
    output: {
        post: {
            id: number;
            title: string;
        };
    };
    meta: object;
    errorShape: DefaultErrorShape;
}>>
byId
.
function invalidate(input?: {
    id?: number | undefined;
} | undefined, filters?: (Omit<InvalidateQueryFilters<readonly unknown[]>, "predicate"> & {
    predicate?: ((query: Query<{
        post: {
            id: number;
            title: string;
        };
    }, TRPCClientError<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }>, {
        post: {
            id: number;
            title: string;
        };
    }, QueryKeyKnown<{
        id: number;
    }, "query">>) => boolean) | undefined;
}) | undefined, options?: InvalidateOptions): Promise<void>
invalidate
({ id?: number | undefinedid:
input: {
    id: number;
    title: string;
}
input
.id: numberid }); // Will not invalidate queries for other id's
}, }); // [...] }

Invalidating across whole routers

It is also possible to invalidate queries across an entire router rather than just one query.

Example code

Backend code
server/routers/_app.ts
import { const initTRPC: TRPCBuilder<object, object>initTRPC } from '@trpc/server';
import { import zz } from 'zod';

export const 
const t: TRPCRootObject<object, object, RuntimeConfigOptions<object, object>, {
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}>
t
= const initTRPC: TRPCBuilder<object, object>initTRPC.
TRPCBuilder<object, object>.create<RuntimeConfigOptions<object, object>>(opts?: RuntimeConfigOptions<object, object> | undefined): TRPCRootObject<object, object, RuntimeConfigOptions<object, object>, {
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}>
create
();
export const
const appRouter: BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    post: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        all: QueryProcedure<{
            input: void;
            output: {
                posts: {
                    id: number;
                    title: string;
                }[];
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        byId: QueryProcedure<{
            input: {
                id: string;
            };
            output: {
                post: {
                    id: string;
                    title: string;
                };
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        edit: MutationProcedure<{
            input: {
                id: number;
                title: string;
            };
            output: {
                ...;
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
    }>>;
    user: BuiltRouter<...>;
}>>
appRouter
=
const t: TRPCRootObject<object, object, RuntimeConfigOptions<object, object>, {
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}>
t
.
TRPCRootObject<object, object, RuntimeConfigOptions<object, object>, { ctx: object; meta: object; errorShape: DefaultErrorShape; transformer: false; }>.router: RouterBuilder
<{
    post: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        all: QueryProcedure<{
            input: void;
            output: {
                posts: {
                    id: number;
                    title: string;
                }[];
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        byId: QueryProcedure<{
            input: {
                id: string;
            };
            output: {
                post: {
                    id: string;
                    title: string;
                };
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        edit: MutationProcedure<{
            input: {
                id: number;
                title: string;
            };
            output: {
                post: {
                    id: number;
                    title: string;
                };
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
    }>>;
    user: BuiltRouter<...>;
}>(_: {
    post: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        all: QueryProcedure<{
            input: void;
            output: {
                posts: {
                    id: number;
                    title: string;
                }[];
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        byId: QueryProcedure<{
            input: {
                id: string;
            };
            output: {
                post: {
                    id: string;
                    title: string;
                };
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        edit: MutationProcedure<{
            input: {
                id: number;
                title: string;
            };
            output: {
                post: {
                    id: number;
                    title: string;
                };
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
    }>>;
    user: BuiltRouter<...>;
}) => BuiltRouter<...>
router
({
// sub Post router
post: BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    all: QueryProcedure<{
        input: void;
        output: {
            posts: {
                id: number;
                title: string;
            }[];
        };
        meta: object;
        errorShape: DefaultErrorShape;
    }>;
    byId: QueryProcedure<{
        input: {
            id: string;
        };
        output: {
            post: {
                id: string;
                title: string;
            };
        };
        meta: object;
        errorShape: DefaultErrorShape;
    }>;
    edit: MutationProcedure<{
        input: {
            id: number;
            title: string;
        };
        output: {
            ...;
        };
        meta: object;
        errorShape: DefaultErrorShape;
    }>;
}>>
post
:
const t: TRPCRootObject<object, object, RuntimeConfigOptions<object, object>, {
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}>
t
.
TRPCRootObject<object, object, RuntimeConfigOptions<object, object>, { ctx: object; meta: object; errorShape: DefaultErrorShape; transformer: false; }>.router: RouterBuilder
<{
    all: QueryProcedure<{
        input: void;
        output: {
            posts: {
                id: number;
                title: string;
            }[];
        };
        meta: object;
        errorShape: DefaultErrorShape;
    }>;
    byId: QueryProcedure<{
        input: {
            id: string;
        };
        output: {
            post: {
                id: string;
                title: string;
            };
        };
        meta: object;
        errorShape: DefaultErrorShape;
    }>;
    edit: MutationProcedure<{
        input: {
            id: number;
            title: string;
        };
        output: {
            post: {
                id: number;
                title: string;
            };
        };
        meta: object;
        errorShape: DefaultErrorShape;
    }>;
}>(_: {
    all: QueryProcedure<{
        input: void;
        output: {
            posts: {
                id: number;
                title: string;
            }[];
        };
        meta: object;
        errorShape: DefaultErrorShape;
    }>;
    byId: QueryProcedure<{
        input: {
            id: string;
        };
        output: {
            post: {
                id: string;
                title: string;
            };
        };
        meta: object;
        errorShape: DefaultErrorShape;
    }>;
    edit: MutationProcedure<{
        input: {
            id: number;
            title: string;
        };
        output: {
            post: {
                id: number;
                title: string;
            };
        };
        meta: object;
        errorShape: DefaultErrorShape;
    }>;
}) => BuiltRouter<...>
router
({
all: QueryProcedure<{
    input: void;
    output: {
        posts: {
            id: number;
            title: string;
        }[];
    };
    meta: object;
    errorShape: DefaultErrorShape;
}>
all
:
const t: TRPCRootObject<object, object, RuntimeConfigOptions<object, object>, {
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}>
t
.TRPCRootObject<object, object, RuntimeConfigOptions<object, object>, { ctx: object; meta: object; errorShape: DefaultErrorShape; transformer: false; }>.procedure: ProcedureBuilder<object, object, object, UnsetMarker, UnsetMarker, UnsetMarker, UnsetMarker, false, DefaultErrorShape>procedure.
ProcedureBuilder<object, object, object, UnsetMarker, UnsetMarker, UnsetMarker, UnsetMarker, false, DefaultErrorShape>.query<{
    posts: {
        id: number;
        title: string;
    }[];
}>(resolver: ProcedureResolver<object, object, object, UnsetMarker, UnsetMarker, {
    posts: {
        id: number;
        title: string;
    }[];
}>): QueryProcedure<{
    input: void;
    output: {
        posts: {
            id: number;
            title: string;
        }[];
    };
    meta: object;
    errorShape: DefaultErrorShape;
}>
query
(() => {
return {
posts: {
    id: number;
    title: string;
}[]
posts
: [
{ id: numberid: 1, title: stringtitle: 'everlong' }, { id: numberid: 2, title: stringtitle: 'After Dark' }, ], }; }),
byId: QueryProcedure<{
    input: {
        id: string;
    };
    output: {
        post: {
            id: string;
            title: string;
        };
    };
    meta: object;
    errorShape: DefaultErrorShape;
}>
byId
:
const t: TRPCRootObject<object, object, RuntimeConfigOptions<object, object>, {
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}>
t
.TRPCRootObject<object, object, RuntimeConfigOptions<object, object>, { ctx: object; meta: object; errorShape: DefaultErrorShape; transformer: false; }>.procedure: ProcedureBuilder<object, object, object, UnsetMarker, UnsetMarker, UnsetMarker, UnsetMarker, false, DefaultErrorShape>procedure
.
ProcedureBuilder<object, object, object, UnsetMarker, UnsetMarker, UnsetMarker, UnsetMarker, false, DefaultErrorShape>.input<z.ZodObject<{
    id: z.ZodString;
}, z.core.$strip>>(schema: z.ZodObject<{
    id: z.ZodString;
}, z.core.$strip>): ProcedureBuilder<object, object, object, {
    id: string;
}, {
    id: string;
}, UnsetMarker, UnsetMarker, false, DefaultErrorShape>
input
(
import zz.
function object<{
    id: z.ZodString;
}>(shape?: {
    id: z.ZodString;
} | undefined, params?: string | {
    error?: string | z.core.$ZodErrorMap<NonNullable<z.core.$ZodIssueUnrecognizedKeys | z.core.$ZodIssueInvalidType<unknown>>> | undefined;
    message?: string | undefined | undefined;
} | undefined): z.ZodObject<{
    id: z.ZodString;
}, z.core.$strip>
object
({
id: z.ZodStringid: import zz.function string(params?: string | z.core.$ZodStringParams): z.ZodString (+1 overload)string(), }), ) .
ProcedureBuilder<object, object, object, { id: string; }, { id: string; }, UnsetMarker, UnsetMarker, false, DefaultErrorShape>.query<{
    post: {
        id: string;
        title: string;
    };
}>(resolver: ProcedureResolver<object, object, object, {
    id: string;
}, UnsetMarker, {
    post: {
        id: string;
        title: string;
    };
}>): QueryProcedure<{
    input: {
        id: string;
    };
    output: {
        post: {
            id: string;
            title: string;
        };
    };
    meta: object;
    errorShape: DefaultErrorShape;
}>
query
(({
input: {
    id: string;
}
input
}) => {
return {
post: {
    id: string;
    title: string;
}
post
: { id: stringid:
input: {
    id: string;
}
input
?.id: stringid, title: stringtitle: 'Look me up!' },
}; }),
edit: MutationProcedure<{
    input: {
        id: number;
        title: string;
    };
    output: {
        ...;
    };
    meta: object;
    errorShape: DefaultErrorShape;
}>
edit
:
const t: TRPCRootObject<object, object, RuntimeConfigOptions<object, object>, {
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}>
t
.TRPCRootObject<object, object, RuntimeConfigOptions<object, object>, { ctx: object; meta: object; errorShape: DefaultErrorShape; transformer: false; }>.procedure: ProcedureBuilder<object, object, object, UnsetMarker, UnsetMarker, UnsetMarker, UnsetMarker, false, DefaultErrorShape>procedure
.
ProcedureBuilder<object, object, object, UnsetMarker, UnsetMarker, UnsetMarker, UnsetMarker, false, DefaultErrorShape>.input<z.ZodObject<{
    id: z.ZodNumber;
    title: z.ZodString;
}, z.core.$strip>>(schema: z.ZodObject<{
    id: z.ZodNumber;
    title: z.ZodString;
}, z.core.$strip>): ProcedureBuilder<object, object, object, {
    id: number;
    title: string;
}, {
    id: number;
    title: string;
}, UnsetMarker, UnsetMarker, false, DefaultErrorShape>
input
(import zz.
function object<{
    id: z.ZodNumber;
    title: z.ZodString;
}>(shape?: {
    id: z.ZodNumber;
    title: z.ZodString;
} | undefined, params?: string | {
    error?: string | z.core.$ZodErrorMap<NonNullable<z.core.$ZodIssueUnrecognizedKeys | z.core.$ZodIssueInvalidType<unknown>>> | undefined;
    message?: string | undefined | undefined;
} | undefined): z.ZodObject<{
    id: z.ZodNumber;
    title: z.ZodString;
}, z.core.$strip>
object
({ id: z.ZodNumberid: import zz.function number(params?: string | z.core.$ZodNumberParams): z.ZodNumbernumber(), title: z.ZodStringtitle: import zz.function string(params?: string | z.core.$ZodStringParams): z.ZodString (+1 overload)string() }))
.
ProcedureBuilder<object, object, object, { id: number; title: string; }, { id: number; title: string; }, UnsetMarker, UnsetMarker, false, DefaultErrorShape>.mutation<{
    post: {
        id: number;
        title: string;
    };
}>(resolver: ProcedureResolver<object, object, object, {
    id: number;
    title: string;
}, UnsetMarker, {
    post: {
        id: number;
        title: string;
    };
}>): MutationProcedure<{
    input: {
        id: number;
        title: string;
    };
    output: {
        post: {
            id: number;
            title: string;
        };
    };
    meta: object;
    errorShape: DefaultErrorShape;
}>
mutation
(({
input: {
    id: number;
    title: string;
}
input
}) => {
return {
post: {
    id: number;
    title: string;
}
post
: { id: numberid:
input: {
    id: number;
    title: string;
}
input
.id: numberid, title: stringtitle:
input: {
    id: number;
    title: string;
}
input
.title: stringtitle } };
}), }), // separate user router
user: BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    all: QueryProcedure<{
        input: void;
        output: {
            users: {
                name: string;
            }[];
        };
        meta: object;
        errorShape: DefaultErrorShape;
    }>;
}>>
user
:
const t: TRPCRootObject<object, object, RuntimeConfigOptions<object, object>, {
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}>
t
.
TRPCRootObject<object, object, RuntimeConfigOptions<object, object>, { ctx: object; meta: object; errorShape: DefaultErrorShape; transformer: false; }>.router: RouterBuilder
<{
    all: QueryProcedure<{
        input: void;
        output: {
            users: {
                name: string;
            }[];
        };
        meta: object;
        errorShape: DefaultErrorShape;
    }>;
}>(_: {
    all: QueryProcedure<{
        input: void;
        output: {
            users: {
                name: string;
            }[];
        };
        meta: object;
        errorShape: DefaultErrorShape;
    }>;
}) => BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    all: QueryProcedure<{
        input: void;
        output: {
            users: {
                name: string;
            }[];
        };
        meta: object;
        errorShape: DefaultErrorShape;
    }>;
}>>
router
({
all: QueryProcedure<{
    input: void;
    output: {
        users: {
            name: string;
        }[];
    };
    meta: object;
    errorShape: DefaultErrorShape;
}>
all
:
const t: TRPCRootObject<object, object, RuntimeConfigOptions<object, object>, {
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}>
t
.TRPCRootObject<object, object, RuntimeConfigOptions<object, object>, { ctx: object; meta: object; errorShape: DefaultErrorShape; transformer: false; }>.procedure: ProcedureBuilder<object, object, object, UnsetMarker, UnsetMarker, UnsetMarker, UnsetMarker, false, DefaultErrorShape>procedure.
ProcedureBuilder<object, object, object, UnsetMarker, UnsetMarker, UnsetMarker, UnsetMarker, false, DefaultErrorShape>.query<{
    users: {
        name: string;
    }[];
}>(resolver: ProcedureResolver<object, object, object, UnsetMarker, UnsetMarker, {
    users: {
        name: string;
    }[];
}>): QueryProcedure<{
    input: void;
    output: {
        users: {
            name: string;
        }[];
    };
    meta: object;
    errorShape: DefaultErrorShape;
}>
query
(() => {
return {
users: {
    name: string;
}[]
users
: [{ name: stringname: 'Dave Grohl' }, { name: stringname: 'Haruki Murakami' }] };
}), }), });
import { 
const trpc: CreateTRPCReactBase<BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    post: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        all: QueryProcedure<{
            input: void;
            output: {
                posts: {
                    id: number;
                    title: string;
                }[];
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        byId: QueryProcedure<{
            input: {
                id: number;
            };
            output: {
                post: {
                    id: number;
                    title: string;
                };
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        edit: MutationProcedure<{
            input: {
                ...;
            };
            output: {
                ...;
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
    }>>;
    user: BuiltRouter<...>;
}>>, unknown> & DecorateRouterRecord<...>
trpc
} from './utils/trpc';
function function MyComponent(): voidMyComponent() { const
const utils: TRPCContextPropsBase<BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    post: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        all: QueryProcedure<{
            input: void;
            output: {
                posts: {
                    id: number;
                    title: string;
                }[];
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        byId: QueryProcedure<{
            input: {
                id: number;
            };
            output: {
                post: {
                    id: number;
                    title: string;
                };
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        edit: MutationProcedure<{
            input: {
                ...;
            };
            output: {
                ...;
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
    }>>;
    user: BuiltRouter<...>;
}>>, unknown> & {
    ...;
} & DecorateRouter & {
    ...;
}
utils
=
const trpc: CreateTRPCReactBase<BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    post: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        all: QueryProcedure<{
            input: void;
            output: {
                posts: {
                    id: number;
                    title: string;
                }[];
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        byId: QueryProcedure<{
            input: {
                id: number;
            };
            output: {
                post: {
                    id: number;
                    title: string;
                };
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        edit: MutationProcedure<{
            input: {
                ...;
            };
            output: {
                ...;
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
    }>>;
    user: BuiltRouter<...>;
}>>, unknown> & DecorateRouterRecord<...>
trpc
.
function useUtils(): TRPCContextPropsBase<BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    post: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        all: QueryProcedure<{
            input: void;
            output: {
                posts: {
                    id: number;
                    title: string;
                }[];
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        byId: QueryProcedure<{
            input: {
                id: number;
            };
            output: {
                post: {
                    id: number;
                    title: string;
                };
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        edit: MutationProcedure<{
            input: {
                ...;
            };
            output: {
                ...;
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
    }>>;
    user: BuiltRouter<...>;
}>>, unknown> & {
    ...;
} & DecorateRouter & {
    ...;
}
useUtils
();
const const invalidateAllQueriesAcrossAllRouters: () => voidinvalidateAllQueriesAcrossAllRouters = () => { // 1️⃣ // All queries on all routers will be invalidated
const utils: TRPCContextPropsBase<BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    post: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        all: QueryProcedure<{
            input: void;
            output: {
                posts: {
                    id: number;
                    title: string;
                }[];
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        byId: QueryProcedure<{
            input: {
                id: number;
            };
            output: {
                post: {
                    id: number;
                    title: string;
                };
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        edit: MutationProcedure<{
            input: {
                ...;
            };
            output: {
                ...;
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
    }>>;
    user: BuiltRouter<...>;
}>>, unknown> & {
    ...;
} & DecorateRouter & {
    ...;
}
utils
.function invalidate(input?: undefined, filters?: InvalidateQueryFilters, options?: InvalidateOptions): Promise<void>invalidate();
}; const const invalidateAllPostQueries: () => voidinvalidateAllPostQueries = () => { // 2️⃣ // All post queries will be invalidated
const utils: TRPCContextPropsBase<BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    post: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        all: QueryProcedure<{
            input: void;
            output: {
                posts: {
                    id: number;
                    title: string;
                }[];
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        byId: QueryProcedure<{
            input: {
                id: number;
            };
            output: {
                post: {
                    id: number;
                    title: string;
                };
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        edit: MutationProcedure<{
            input: {
                ...;
            };
            output: {
                ...;
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
    }>>;
    user: BuiltRouter<...>;
}>>, unknown> & {
    ...;
} & DecorateRouter & {
    ...;
}
utils
.
post: DecorateRouter & {
    all: DecorateQueryProcedure<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, QueryProcedure<{
        input: void;
        output: {
            posts: {
                id: number;
                title: string;
            }[];
        };
        meta: object;
        errorShape: DefaultErrorShape;
    }>>;
    byId: DecorateQueryProcedure<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, QueryProcedure<{
        input: {
            id: number;
        };
        output: {
            post: {
                id: number;
                title: string;
            };
        };
        meta: object;
        errorShape: DefaultErrorShape;
    }>>;
    edit: DecorateMutationProcedure<...>;
}
post
.function invalidate(input?: undefined, filters?: InvalidateQueryFilters, options?: InvalidateOptions): Promise<void>invalidate();
}; const const invalidatePostById: () => voidinvalidatePostById = () => { // 3️⃣ // All queries in the post router with input {id:1} invalidated
const utils: TRPCContextPropsBase<BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    post: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        all: QueryProcedure<{
            input: void;
            output: {
                posts: {
                    id: number;
                    title: string;
                }[];
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        byId: QueryProcedure<{
            input: {
                id: number;
            };
            output: {
                post: {
                    id: number;
                    title: string;
                };
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        edit: MutationProcedure<{
            input: {
                ...;
            };
            output: {
                ...;
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
    }>>;
    user: BuiltRouter<...>;
}>>, unknown> & {
    ...;
} & DecorateRouter & {
    ...;
}
utils
.
post: DecorateRouter & {
    all: DecorateQueryProcedure<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, QueryProcedure<{
        input: void;
        output: {
            posts: {
                id: number;
                title: string;
            }[];
        };
        meta: object;
        errorShape: DefaultErrorShape;
    }>>;
    byId: DecorateQueryProcedure<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, QueryProcedure<{
        input: {
            id: number;
        };
        output: {
            post: {
                id: number;
                title: string;
            };
        };
        meta: object;
        errorShape: DefaultErrorShape;
    }>>;
    edit: DecorateMutationProcedure<...>;
}
post
.
byId: DecorateQueryProcedure<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, QueryProcedure<{
    input: {
        id: number;
    };
    output: {
        post: {
            id: number;
            title: string;
        };
    };
    meta: object;
    errorShape: DefaultErrorShape;
}>>
byId
.
function invalidate(input?: {
    id?: number | undefined;
} | undefined, filters?: (Omit<InvalidateQueryFilters<readonly unknown[]>, "predicate"> & {
    predicate?: ((query: Query<{
        post: {
            id: number;
            title: string;
        };
    }, TRPCClientError<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }>, {
        post: {
            id: number;
            title: string;
        };
    }, QueryKeyKnown<{
        id: number;
    }, "query">>) => boolean) | undefined;
}) | undefined, options?: InvalidateOptions): Promise<void>
invalidate
({ id?: number | undefinedid: 1 });
}; // Example queries
const trpc: CreateTRPCReactBase<BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    post: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        all: QueryProcedure<{
            input: void;
            output: {
                posts: {
                    id: number;
                    title: string;
                }[];
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        byId: QueryProcedure<{
            input: {
                id: number;
            };
            output: {
                post: {
                    id: number;
                    title: string;
                };
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        edit: MutationProcedure<{
            input: {
                ...;
            };
            output: {
                ...;
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
    }>>;
    user: BuiltRouter<...>;
}>>, unknown> & DecorateRouterRecord<...>
trpc
.
user: DecorateRouterRecord<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    all: QueryProcedure<{
        input: void;
        output: {
            users: {
                name: string;
            }[];
        };
        meta: object;
        errorShape: DefaultErrorShape;
    }>;
}>>
user
.
all: DecoratedQuery<{
    input: void;
    output: {
        users: {
            name: string;
        }[];
    };
    transformer: false;
    errorShape: DefaultErrorShape;
}>
all
.
useQuery: ProcedureUseQuery
<{
    users: {
        name: string;
    }[];
}, {
    users: {
        name: string;
    }[];
}>(input: void | unique symbol, opts?: UseTRPCQueryOptions<{
    users: {
        name: string;
    }[];
}, {
    users: {
        name: string;
    }[];
}, TRPCClientErrorLike<{
    input: void;
    output: {
        users: {
            name: string;
        }[];
    };
    transformer: false;
    errorShape: DefaultErrorShape;
}>, {
    users: {
        name: string;
    }[];
}> | undefined) => UseTRPCQueryResult<{
    users: {
        name: string;
    }[];
}, TRPCClientErrorLike<{
    input: void;
    output: {
        users: {
            name: string;
        }[];
    };
    transformer: false;
    errorShape: DefaultErrorShape;
}>> (+1 overload)
useQuery
(); // Would only be validated by 1️⃣ only.
const trpc: CreateTRPCReactBase<BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    post: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        all: QueryProcedure<{
            input: void;
            output: {
                posts: {
                    id: number;
                    title: string;
                }[];
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        byId: QueryProcedure<{
            input: {
                id: number;
            };
            output: {
                post: {
                    id: number;
                    title: string;
                };
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        edit: MutationProcedure<{
            input: {
                ...;
            };
            output: {
                ...;
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
    }>>;
    user: BuiltRouter<...>;
}>>, unknown> & DecorateRouterRecord<...>
trpc
.
post: DecorateRouterRecord<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    all: QueryProcedure<{
        input: void;
        output: {
            posts: {
                id: number;
                title: string;
            }[];
        };
        meta: object;
        errorShape: DefaultErrorShape;
    }>;
    byId: QueryProcedure<{
        input: {
            id: number;
        };
        output: {
            post: {
                id: number;
                title: string;
            };
        };
        meta: object;
        errorShape: DefaultErrorShape;
    }>;
    edit: MutationProcedure<{
        input: {
            ...;
        };
        output: {
            ...;
        };
        meta: object;
        errorShape: DefaultErrorShape;
    }>;
}>>
post
.
all: DecoratedQuery<{
    input: void;
    output: {
        posts: {
            id: number;
            title: string;
        }[];
    };
    transformer: false;
    errorShape: DefaultErrorShape;
}>
all
.
useQuery: ProcedureUseQuery
<{
    posts: {
        id: number;
        title: string;
    }[];
}, {
    posts: {
        id: number;
        title: string;
    }[];
}>(input: void | unique symbol, opts?: UseTRPCQueryOptions<{
    posts: {
        id: number;
        title: string;
    }[];
}, {
    posts: {
        id: number;
        title: string;
    }[];
}, TRPCClientErrorLike<{
    input: void;
    output: {
        posts: {
            id: number;
            title: string;
        }[];
    };
    transformer: false;
    errorShape: DefaultErrorShape;
}>, {
    posts: {
        id: number;
        title: string;
    }[];
}> | undefined) => UseTRPCQueryResult<{
    posts: {
        id: number;
        title: string;
    }[];
}, TRPCClientErrorLike<{
    input: void;
    output: {
        posts: {
            id: number;
            title: string;
        }[];
    };
    transformer: false;
    errorShape: DefaultErrorShape;
}>> (+1 overload)
useQuery
(); // Would be invalidated by 1️⃣ & 2️⃣
const trpc: CreateTRPCReactBase<BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    post: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        all: QueryProcedure<{
            input: void;
            output: {
                posts: {
                    id: number;
                    title: string;
                }[];
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        byId: QueryProcedure<{
            input: {
                id: number;
            };
            output: {
                post: {
                    id: number;
                    title: string;
                };
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        edit: MutationProcedure<{
            input: {
                ...;
            };
            output: {
                ...;
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
    }>>;
    user: BuiltRouter<...>;
}>>, unknown> & DecorateRouterRecord<...>
trpc
.
post: DecorateRouterRecord<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    all: QueryProcedure<{
        input: void;
        output: {
            posts: {
                id: number;
                title: string;
            }[];
        };
        meta: object;
        errorShape: DefaultErrorShape;
    }>;
    byId: QueryProcedure<{
        input: {
            id: number;
        };
        output: {
            post: {
                id: number;
                title: string;
            };
        };
        meta: object;
        errorShape: DefaultErrorShape;
    }>;
    edit: MutationProcedure<{
        input: {
            ...;
        };
        output: {
            ...;
        };
        meta: object;
        errorShape: DefaultErrorShape;
    }>;
}>>
post
.
byId: DecoratedQuery<{
    input: {
        id: number;
    };
    output: {
        post: {
            id: number;
            title: string;
        };
    };
    transformer: false;
    errorShape: DefaultErrorShape;
}>
byId
.
useQuery: ProcedureUseQuery
<{
    post: {
        id: number;
        title: string;
    };
}, {
    post: {
        id: number;
        title: string;
    };
}>(input: {
    id: number;
} | unique symbol, opts?: UseTRPCQueryOptions<{
    post: {
        id: number;
        title: string;
    };
}, {
    post: {
        id: number;
        title: string;
    };
}, TRPCClientErrorLike<{
    input: {
        id: number;
    };
    output: {
        post: {
            id: number;
            title: string;
        };
    };
    transformer: false;
    errorShape: DefaultErrorShape;
}>, {
    post: {
        id: number;
        title: string;
    };
}> | undefined) => UseTRPCQueryResult<{
    post: {
        id: number;
        title: string;
    };
}, TRPCClientErrorLike<{
    input: {
        id: number;
    };
    output: {
        post: {
            id: number;
            title: string;
        };
    };
    transformer: false;
    errorShape: DefaultErrorShape;
}>> (+1 overload)
useQuery
({ id: numberid: 1 }); // Would be invalidated by 1️⃣, 2️⃣ and 3️⃣
const trpc: CreateTRPCReactBase<BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    post: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        all: QueryProcedure<{
            input: void;
            output: {
                posts: {
                    id: number;
                    title: string;
                }[];
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        byId: QueryProcedure<{
            input: {
                id: number;
            };
            output: {
                post: {
                    id: number;
                    title: string;
                };
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        edit: MutationProcedure<{
            input: {
                ...;
            };
            output: {
                ...;
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
    }>>;
    user: BuiltRouter<...>;
}>>, unknown> & DecorateRouterRecord<...>
trpc
.
post: DecorateRouterRecord<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    all: QueryProcedure<{
        input: void;
        output: {
            posts: {
                id: number;
                title: string;
            }[];
        };
        meta: object;
        errorShape: DefaultErrorShape;
    }>;
    byId: QueryProcedure<{
        input: {
            id: number;
        };
        output: {
            post: {
                id: number;
                title: string;
            };
        };
        meta: object;
        errorShape: DefaultErrorShape;
    }>;
    edit: MutationProcedure<{
        input: {
            ...;
        };
        output: {
            ...;
        };
        meta: object;
        errorShape: DefaultErrorShape;
    }>;
}>>
post
.
byId: DecoratedQuery<{
    input: {
        id: number;
    };
    output: {
        post: {
            id: number;
            title: string;
        };
    };
    transformer: false;
    errorShape: DefaultErrorShape;
}>
byId
.
useQuery: ProcedureUseQuery
<{
    post: {
        id: number;
        title: string;
    };
}, {
    post: {
        id: number;
        title: string;
    };
}>(input: {
    id: number;
} | unique symbol, opts?: UseTRPCQueryOptions<{
    post: {
        id: number;
        title: string;
    };
}, {
    post: {
        id: number;
        title: string;
    };
}, TRPCClientErrorLike<{
    input: {
        id: number;
    };
    output: {
        post: {
            id: number;
            title: string;
        };
    };
    transformer: false;
    errorShape: DefaultErrorShape;
}>, {
    post: {
        id: number;
        title: string;
    };
}> | undefined) => UseTRPCQueryResult<{
    post: {
        id: number;
        title: string;
    };
}, TRPCClientErrorLike<{
    input: {
        id: number;
    };
    output: {
        post: {
            id: number;
            title: string;
        };
    };
    transformer: false;
    errorShape: DefaultErrorShape;
}>> (+1 overload)
useQuery
({ id: numberid: 2 }); // would be invalidated by 1️⃣ and 2️⃣ but NOT 3️⃣!
// [...] }

Invalidate full cache on every mutation

Keeping track of exactly what queries a mutation should invalidate is hard, therefore, it can be a pragmatic solution to invalidate the full cache as a side-effect on any mutation. Since we have request batching, this invalidation will simply refetch all queries on the page you're looking at in one single request.

We have added a feature to help with this:

import { function createTRPCReact<TRouter extends AnyRouter, TSSRContext = unknown>(opts?: CreateTRPCReactOptions<TRouter>): CreateTRPCReact<TRouter, TSSRContext>createTRPCReact } from '@trpc/react-query';
import type { 
type AppRouter = Router<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    post: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        all: QueryProcedure<{
            input: void;
            output: {
                posts: {
                    id: number;
                    title: string;
                }[];
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
    }>>;
}>> & DecorateCreateRouterOptions<{
    post: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        all: QueryProcedure<{
            input: void;
            output: {
                posts: {
                    id: number;
                    title: string;
                }[];
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
    }>>;
}>
AppRouter
} from '../server';
export const
const trpc: CreateTRPCReactBase<BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    post: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        all: QueryProcedure<{
            input: void;
            output: {
                posts: {
                    id: number;
                    title: string;
                }[];
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
    }>>;
}>>, unknown> & DecorateRouterRecord<...>
trpc
=
createTRPCReact<BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    post: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        all: QueryProcedure<{
            input: void;
            output: {
                posts: {
                    id: number;
                    title: string;
                }[];
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
    }>>;
}>>, unknown>(opts?: CreateTRPCReactOptions<...> | undefined): CreateTRPCReactBase<...> & DecorateRouterRecord<...>
createTRPCReact
<
type AppRouter = Router<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    post: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        all: QueryProcedure<{
            input: void;
            output: {
                posts: {
                    id: number;
                    title: string;
                }[];
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
    }>>;
}>> & DecorateCreateRouterOptions<{
    post: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        all: QueryProcedure<{
            input: void;
            output: {
                posts: {
                    id: number;
                    title: string;
                }[];
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
    }>>;
}>
AppRouter
>({
CreateTRPCReactOptions<BuiltRouter<{ ctx: object; meta: object; errorShape: DefaultErrorShape; transformer: false; }, DecorateCreateRouterOptions<{ post: BuiltRouter<{ ctx: object; meta: object; errorShape: DefaultErrorShape; transformer: false; }, DecorateCreateRouterOptions<...>>; }>>>.overrides?: {
    useMutation?: Partial<UseMutationOverride>;
} | undefined
overrides
: {
useMutation?: Partial<UseMutationOverride> | undefineduseMutation: { /** * This function is called whenever a `.useMutation` succeeds **/ async
onSuccess?: ((opts: {
    originalFn: () => MaybePromise<void>;
    queryClient: QueryClient;
    meta: Record<string, unknown>;
}) => MaybePromise<void>) | undefined
onSuccess
(
opts: {
    originalFn: () => MaybePromise<void>;
    queryClient: QueryClient;
    meta: Record<string, unknown>;
}
opts
) {
/** * @note that order here matters: * The order here allows route changes in `onSuccess` without * having a flash of content change whilst redirecting. **/ // Calls the `onSuccess` defined in the `useQuery()`-options: await
opts: {
    originalFn: () => MaybePromise<void>;
    queryClient: QueryClient;
    meta: Record<string, unknown>;
}
opts
.originalFn: () => MaybePromise<void>originalFn();
// Invalidate all queries in the react-query cache: await
opts: {
    originalFn: () => MaybePromise<void>;
    queryClient: QueryClient;
    meta: Record<string, unknown>;
}
opts
.queryClient: QueryClientqueryClient.QueryClient.invalidateQueries<readonly unknown[]>(filters?: InvalidateQueryFilters<readonly unknown[]> | undefined, options?: InvalidateOptions): Promise<void>invalidateQueries();
}, }, }, });

Additional Options

Aside from the query helpers, the object useUtils returns also contains the following properties:

interface interface ProxyTRPCContextProps<TRouter extends unknown, TSSRContext>ProxyTRPCContextProps<function (type parameter) TRouter in ProxyTRPCContextProps<TRouter extends unknown, TSSRContext>TRouter extends type AnyRouter = anyAnyRouter, function (type parameter) TSSRContext in ProxyTRPCContextProps<TRouter extends unknown, TSSRContext>TSSRContext> {
  /**
   * The `TRPCClient`
   */
  ProxyTRPCContextProps<TRouter extends unknown, TSSRContext>.client: anyclient: type TRPCClient<T> = anyTRPCClient<function (type parameter) TRouter in ProxyTRPCContextProps<TRouter extends unknown, TSSRContext>TRouter>;
  /**
   * The SSR context when server-side rendering
   * @default null
   */
  ProxyTRPCContextProps<TRouter extends unknown, TSSRContext>.ssrContext?: TSSRContext | null | undefinedssrContext?: function (type parameter) TSSRContext in ProxyTRPCContextProps<TRouter extends unknown, TSSRContext>TSSRContext | null;
  /**
   * State of SSR hydration.
   * - `false` if not using SSR.
   * - `prepass` when doing a prepass to fetch queries' data
   * - `mounting` before TRPCProvider has been rendered on the client
   * - `mounted` when the TRPCProvider has been rendered on the client
   * @default false
   */
  ProxyTRPCContextProps<TRouter extends unknown, TSSRContext>.ssrState?: SSRState | undefinedssrState?: type SSRState = false | "prepass" | "mounting" | "mounted"SSRState;
  /**
   * Abort loading query calls when unmounting a component - usually when navigating to a new page
   * @default false
   */
  ProxyTRPCContextProps<TRouter extends unknown, TSSRContext>.abortOnUnmount?: boolean | undefinedabortOnUnmount?: boolean;
}