Skip to content
tRPC

useInfiniteQuery()

On this page

Example Procedure

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<{
    infinitePosts: QueryProcedure<{
        input: {
            direction: "forward" | "backward";
            limit?: number | null | undefined;
            cursor?: number | null | undefined;
        };
        output: {
            items: {
                myCursor: number;
            }[];
            nextCursor: number | undefined;
        };
        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
<{
    infinitePosts: QueryProcedure<{
        input: {
            direction: "forward" | "backward";
            limit?: number | null | undefined;
            cursor?: number | null | undefined;
        };
        output: {
            items: {
                myCursor: number;
            }[];
            nextCursor: number | undefined;
        };
        meta: object;
        errorShape: DefaultErrorShape;
    }>;
}>(_: {
    infinitePosts: QueryProcedure<{
        input: {
            direction: "forward" | "backward";
            limit?: number | null | undefined;
            cursor?: number | null | undefined;
        };
        output: {
            items: {
                myCursor: number;
            }[];
            nextCursor: number | undefined;
        };
        meta: object;
        errorShape: DefaultErrorShape;
    }>;
}) => BuiltRouter<...>
router
({
infinitePosts: QueryProcedure<{
    input: {
        direction: "forward" | "backward";
        limit?: number | null | undefined;
        cursor?: number | null | undefined;
    };
    output: {
        items: {
            myCursor: number;
        }[];
        nextCursor: number | undefined;
    };
    meta: object;
    errorShape: DefaultErrorShape;
}>
infinitePosts
:
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<{
    limit: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
    cursor: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
    direction: z.ZodEnum<{
        forward: "forward";
        backward: "backward";
    }>;
}, z.core.$strip>>(schema: z.ZodObject<{
    limit: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
    cursor: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
    direction: z.ZodEnum<{
        forward: "forward";
        backward: "backward";
    }>;
}, z.core.$strip>): ProcedureBuilder<object, object, object, {
    direction: "forward" | "backward";
    limit?: number | null | undefined;
    cursor?: number | ... 1 more ... | undefined;
}, ... 4 more ..., DefaultErrorShape>
input
(
import zz.
function object<{
    limit: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
    cursor: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
    direction: z.ZodEnum<{
        forward: "forward";
        backward: "backward";
    }>;
}>(shape?: {
    limit: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
    cursor: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
    direction: z.ZodEnum<{
        forward: "forward";
        backward: "backward";
    }>;
} | undefined, params?: string | {
    error?: string | z.core.$ZodErrorMap<NonNullable<z.core.$ZodIssueUnrecognizedKeys | z.core.$ZodIssueInvalidType<unknown>>> | undefined;
    message?: string | undefined | undefined;
} | undefined): z.ZodObject<...>
object
({
limit: z.ZodOptional<z.ZodNullable<z.ZodNumber>>limit: import zz.function number(params?: string | z.core.$ZodNumberParams): z.ZodNumbernumber()._ZodNumber<$ZodNumberInternals<number>>.min(value: number, params?: string | z.core.$ZodCheckGreaterThanParams): z.ZodNumbermin(1)._ZodNumber<$ZodNumberInternals<number>>.max(value: number, params?: string | z.core.$ZodCheckLessThanParams): z.ZodNumbermax(100).ZodType<any, any, $ZodNumberInternals<number>>.nullish(): z.ZodOptional<z.ZodNullable<z.ZodNumber>>nullish(), cursor: z.ZodOptional<z.ZodNullable<z.ZodNumber>>cursor: import zz.function number(params?: string | z.core.$ZodNumberParams): z.ZodNumbernumber().ZodType<any, any, $ZodNumberInternals<number>>.nullish(): z.ZodOptional<z.ZodNullable<z.ZodNumber>>nullish(), // <-- "cursor" needs to exist, but can be any type
direction: z.ZodEnum<{
    forward: "forward";
    backward: "backward";
}>
direction
: import zz.
enum<readonly ["forward", "backward"]>(values: readonly ["forward", "backward"], params?: string | z.core.$ZodEnumParams): z.ZodEnum<{
    forward: "forward";
    backward: "backward";
}> (+1 overload)
export enum
enum
(['forward', 'backward']), // optional, useful for bi-directional query
}), ) .
ProcedureBuilder<object, object, object, { direction: "forward" | "backward"; limit?: number | null | undefined; cursor?: number | null | undefined; }, { direction: "forward" | "backward"; limit?: number | ... 1 more ... | undefined; cursor?: number | ... 1 more ... | undefined; }, UnsetMarker, UnsetMarker, false, DefaultErrorShape>.query<{
    items: {
        myCursor: number;
    }[];
    nextCursor: number | undefined;
}>(resolver: ProcedureResolver<object, object, object, {
    direction: "forward" | "backward";
    limit?: number | null | undefined;
    cursor?: number | null | undefined;
}, UnsetMarker, {
    items: {
        myCursor: number;
    }[];
    nextCursor: number | undefined;
}>): QueryProcedure<{
    input: {
        direction: "forward" | "backward";
        limit?: number | null | undefined;
        cursor?: number | null | undefined;
    };
    output: {
        items: {
            myCursor: number;
        }[];
        nextCursor: number | undefined;
    };
    meta: object;
    errorShape: DefaultErrorShape;
}>
query
(async (
opts: ProcedureResolverOptions<object, object, object, {
    direction: "forward" | "backward";
    limit?: number | null | undefined;
    cursor?: number | null | undefined;
}>
opts
) => {
const {
const input: {
    direction: "forward" | "backward";
    limit?: number | null | undefined;
    cursor?: number | null | undefined;
}
input
} =
opts: ProcedureResolverOptions<object, object, object, {
    direction: "forward" | "backward";
    limit?: number | null | undefined;
    cursor?: number | null | undefined;
}>
opts
;
const const limit: numberlimit =
const input: {
    direction: "forward" | "backward";
    limit?: number | null | undefined;
    cursor?: number | null | undefined;
}
input
.limit?: number | null | undefinedlimit ?? 50;
const { const cursor: number | null | undefinedcursor } =
const input: {
    direction: "forward" | "backward";
    limit?: number | null | undefined;
    cursor?: number | null | undefined;
}
input
;
const
const items: {
    myCursor: number;
}[]
items
= await
const prisma: {
    post: {
        findMany: (opts: any) => Promise<{
            myCursor: number;
        }[]>;
    };
}
prisma
.
post: {
    findMany: (opts: any) => Promise<{
        myCursor: number;
    }[]>;
}
post
.
findMany: (opts: any) => Promise<{
    myCursor: number;
}[]>
findMany
({
take: numbertake: const limit: numberlimit + 1, // get an extra item at the end which we'll use as next cursor
where: {
    title: {
        contains: string;
    };
}
where
: {
title: {
    contains: string;
}
title
: {
contains: stringcontains: 'Prisma' /* Optional filter */, }, },
cursor: {
    myCursor: number;
} | undefined
cursor
: const cursor: number | null | undefinedcursor ? { myCursor: numbermyCursor: const cursor: numbercursor } : var undefinedundefined,
orderBy: {
    myCursor: string;
}
orderBy
: {
myCursor: stringmyCursor: 'asc', }, }); let let nextCursor: number | null | undefinednextCursor: typeof const cursor: number | null | undefinedcursor | undefined = var undefinedundefined; if (
const items: {
    myCursor: number;
}[]
items
.Array<{ myCursor: number; }>.length: numberlength > const limit: numberlimit) {
const
const nextItem: {
    myCursor: number;
} | undefined
nextItem
=
const items: {
    myCursor: number;
}[]
items
.
Array<{ myCursor: number; }>.pop(): {
    myCursor: number;
} | undefined
pop
();
let nextCursor: number | null | undefinednextCursor =
const nextItem: {
    myCursor: number;
} | undefined
nextItem
!.myCursor: numbermyCursor;
} return {
items: {
    myCursor: number;
}[]
items
,
nextCursor: number | undefinednextCursor, }; }), });

Example React Component

components/MyComponent.tsx
import { 
const trpc: CreateTRPCReactBase<BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    infinitePosts: QueryProcedure<{
        input: {
            direction: "forward" | "backward";
            limit?: number | null | undefined;
            cursor?: number | null | undefined;
        };
        output: {
            items: {
                id: string;
                title: string;
            }[];
            nextCursor: number | undefined;
        };
        meta: object;
        errorShape: DefaultErrorShape;
    }>;
}>>, unknown> & DecorateRouterRecord<...>
trpc
} from '../utils/trpc';
export function function MyComponent(): voidMyComponent() { const
const myQuery: TRPCHookResult & UseInfiniteQueryResult<{
    pages: {
        items: {
            id: string;
            title: string;
        }[];
        nextCursor?: number | undefined;
    }[];
    pageParams: (number | null | undefined)[];
}, TRPCClientErrorLike<{
    input: {
        direction: "forward" | "backward";
        limit?: number | null | undefined;
        cursor?: number | null | undefined;
    };
    output: {
        items: {
            id: string;
            title: string;
        }[];
        nextCursor?: number | undefined;
    };
    transformer: false;
    errorShape: DefaultErrorShape;
}>>
myQuery
=
const trpc: CreateTRPCReactBase<BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    infinitePosts: QueryProcedure<{
        input: {
            direction: "forward" | "backward";
            limit?: number | null | undefined;
            cursor?: number | null | undefined;
        };
        output: {
            items: {
                id: string;
                title: string;
            }[];
            nextCursor: number | undefined;
        };
        meta: object;
        errorShape: DefaultErrorShape;
    }>;
}>>, unknown> & DecorateRouterRecord<...>
trpc
.
infinitePosts: DecoratedQuery<{
    input: {
        direction: "forward" | "backward";
        limit?: number | null | undefined;
        cursor?: number | null | undefined;
    };
    output: {
        items: {
            id: string;
            title: string;
        }[];
        nextCursor?: number | undefined;
    };
    transformer: false;
    errorShape: DefaultErrorShape;
}>
infinitePosts
.
useInfiniteQuery: useTRPCInfiniteQuery
<{
    pages: {
        items: {
            id: string;
            title: string;
        }[];
        nextCursor?: number | undefined;
    }[];
    pageParams: (number | null | undefined)[];
}>(input: InfiniteInput<{
    direction: "forward" | "backward";
    limit?: number | null | undefined;
    cursor?: number | null | undefined;
}>, opts?: makeInfiniteQueryOptions<number | null | undefined, UndefinedInitialDataInfiniteOptions<{
    items: {
        id: string;
        title: string;
    }[];
    nextCursor?: number | undefined;
}, TRPCClientErrorLike<{
    input: {
        direction: "forward" | "backward";
        limit?: number | null | undefined;
        cursor?: number | null | undefined;
    };
    output: {
        items: {
            id: string;
            title: string;
        }[];
        nextCursor?: number | undefined;
    };
    transformer: false;
    errorShape: DefaultErrorShape;
}>, {
    pages: {
        items: {
            id: string;
            title: string;
        }[];
        nextCursor?: number | undefined;
    }[];
    pageParams: (number | null | undefined)[];
}, any, number | ... 1 more ... | undefined>> | undefined) => TRPCHookResult & UseInfiniteQueryResult<...> (+2 overloads)
useInfiniteQuery
(
{ limit?: number | null | undefinedlimit: 10, }, {
getNextPageParam: GetNextPageParamFunction<number | null | undefined, {
    items: {
        id: string;
        title: string;
    }[];
    nextCursor?: number | undefined;
}>
getNextPageParam
: (
lastPage: {
    items: {
        id: string;
        title: string;
    }[];
    nextCursor?: number | undefined;
}
lastPage
) =>
lastPage: {
    items: {
        id: string;
        title: string;
    }[];
    nextCursor?: number | undefined;
}
lastPage
.nextCursor?: number | undefinednextCursor,
// initialCursor: 1, // <-- optional you can pass an initialCursor }, ); // [...] }

Helpers

getInfiniteData()

This helper gets the currently cached data from an existing infinite query

components/MyComponent.tsx
import { 
const trpc: CreateTRPCReactBase<BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    infinitePosts: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        list: QueryProcedure<{
            input: {
                limit?: number | null | undefined;
                cursor?: number | null | undefined;
                direction?: "forward" | "backward" | undefined;
            };
            output: {
                items: {
                    id: string;
                    title: string;
                    status: string;
                }[];
                nextCursor: number | undefined;
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        add: MutationProcedure<...>;
    }>>;
}>>, unknown> & DecorateRouterRecord<...>
trpc
} from '../utils/trpc';
export function function MyComponent(): voidMyComponent() { const
const utils: TRPCContextPropsBase<BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    infinitePosts: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        list: QueryProcedure<{
            input: {
                limit?: number | null | undefined;
                cursor?: number | null | undefined;
                direction?: "forward" | "backward" | undefined;
            };
            output: {
                items: {
                    id: string;
                    title: string;
                    status: string;
                }[];
                nextCursor: number | undefined;
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        add: MutationProcedure<...>;
    }>>;
}>>, unknown> & {
    ...;
} & DecorateRouter & {
    ...;
}
utils
=
const trpc: CreateTRPCReactBase<BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    infinitePosts: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        list: QueryProcedure<{
            input: {
                limit?: number | null | undefined;
                cursor?: number | null | undefined;
                direction?: "forward" | "backward" | undefined;
            };
            output: {
                items: {
                    id: string;
                    title: string;
                    status: string;
                }[];
                nextCursor: number | undefined;
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        add: MutationProcedure<...>;
    }>>;
}>>, unknown> & DecorateRouterRecord<...>
trpc
.
function useUtils(): TRPCContextPropsBase<BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    infinitePosts: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        list: QueryProcedure<{
            input: {
                limit?: number | null | undefined;
                cursor?: number | null | undefined;
                direction?: "forward" | "backward" | undefined;
            };
            output: {
                items: {
                    id: string;
                    title: string;
                    status: string;
                }[];
                nextCursor: number | undefined;
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        add: MutationProcedure<...>;
    }>>;
}>>, unknown> & {
    ...;
} & DecorateRouter & {
    ...;
}
useUtils
();
const
const myMutation: UseTRPCMutationResult<{
    id: string;
    title: string;
}, TRPCClientErrorLike<{
    input: {
        title: string;
    };
    output: {
        id: string;
        title: string;
    };
    transformer: false;
    errorShape: DefaultErrorShape;
}>, {
    title: string;
}, void>
myMutation
=
const trpc: CreateTRPCReactBase<BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    infinitePosts: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        list: QueryProcedure<{
            input: {
                limit?: number | null | undefined;
                cursor?: number | null | undefined;
                direction?: "forward" | "backward" | undefined;
            };
            output: {
                items: {
                    id: string;
                    title: string;
                    status: string;
                }[];
                nextCursor: number | undefined;
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        add: MutationProcedure<...>;
    }>>;
}>>, unknown> & DecorateRouterRecord<...>
trpc
.
infinitePosts: DecorateRouterRecord<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    list: QueryProcedure<{
        input: {
            limit?: number | null | undefined;
            cursor?: number | null | undefined;
            direction?: "forward" | "backward" | undefined;
        };
        output: {
            items: {
                id: string;
                title: string;
                status: string;
            }[];
            nextCursor: number | undefined;
        };
        meta: object;
        errorShape: DefaultErrorShape;
    }>;
    add: MutationProcedure<{
        input: {
            title: string;
        };
        output: {
            id: string;
            title: string;
        };
        meta: object;
        errorShape: DefaultErrorShape;
    }>;
}>>
infinitePosts
.
add: DecoratedMutation<{
    input: {
        title: string;
    };
    output: {
        id: string;
        title: string;
    };
    transformer: false;
    errorShape: DefaultErrorShape;
}>
add
.
useMutation: <void>(opts?: UseTRPCMutationOptions<{
    title: string;
}, TRPCClientErrorLike<{
    input: {
        title: string;
    };
    output: {
        id: string;
        title: string;
    };
    transformer: false;
    errorShape: DefaultErrorShape;
}>, {
    id: string;
    title: string;
}, void> | undefined) => UseTRPCMutationResult<{
    id: string;
    title: string;
}, TRPCClientErrorLike<{
    input: {
        title: string;
    };
    output: {
        id: string;
        title: string;
    };
    transformer: false;
    errorShape: DefaultErrorShape;
}>, {
    title: string;
}, void>
useMutation
({
async
onMutate?: ((variables: {
    title: string;
}, context: MutationFunctionContext) => void | Promise<void>) | undefined
onMutate
(
opts: {
    title: string;
}
opts
) {
await
const utils: TRPCContextPropsBase<BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    infinitePosts: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        list: QueryProcedure<{
            input: {
                limit?: number | null | undefined;
                cursor?: number | null | undefined;
                direction?: "forward" | "backward" | undefined;
            };
            output: {
                items: {
                    id: string;
                    title: string;
                    status: string;
                }[];
                nextCursor: number | undefined;
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        add: MutationProcedure<...>;
    }>>;
}>>, unknown> & {
    ...;
} & DecorateRouter & {
    ...;
}
utils
.
infinitePosts: DecorateRouter & {
    list: DecorateQueryProcedure<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, QueryProcedure<{
        input: {
            limit?: number | null | undefined;
            cursor?: number | null | undefined;
            direction?: "forward" | "backward" | undefined;
        };
        output: {
            items: {
                id: string;
                title: string;
                status: string;
            }[];
            nextCursor: number | undefined;
        };
        meta: object;
        errorShape: DefaultErrorShape;
    }>>;
    add: DecorateMutationProcedure<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, MutationProcedure<...>>;
}
infinitePosts
.
list: DecorateQueryProcedure<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, QueryProcedure<{
    input: {
        limit?: number | null | undefined;
        cursor?: number | null | undefined;
        direction?: "forward" | "backward" | undefined;
    };
    output: {
        items: {
            id: string;
            title: string;
            status: string;
        }[];
        nextCursor: number | undefined;
    };
    meta: object;
    errorShape: DefaultErrorShape;
}>>
list
.
function cancel(input?: {
    limit?: number | null | undefined;
    cursor?: number | null | undefined;
    direction?: "forward" | "backward" | undefined;
} | undefined, options?: CancelOptions): Promise<void>
cancel
();
const
const allPosts: InfiniteData<{
    items: {
        id: string;
        title: string;
        status: string;
    }[];
    nextCursor?: number | undefined;
}, number | null> | undefined
allPosts
=
const utils: TRPCContextPropsBase<BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    infinitePosts: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        list: QueryProcedure<{
            input: {
                limit?: number | null | undefined;
                cursor?: number | null | undefined;
                direction?: "forward" | "backward" | undefined;
            };
            output: {
                items: {
                    id: string;
                    title: string;
                    status: string;
                }[];
                nextCursor: number | undefined;
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        add: MutationProcedure<...>;
    }>>;
}>>, unknown> & {
    ...;
} & DecorateRouter & {
    ...;
}
utils
.
infinitePosts: DecorateRouter & {
    list: DecorateQueryProcedure<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, QueryProcedure<{
        input: {
            limit?: number | null | undefined;
            cursor?: number | null | undefined;
            direction?: "forward" | "backward" | undefined;
        };
        output: {
            items: {
                id: string;
                title: string;
                status: string;
            }[];
            nextCursor: number | undefined;
        };
        meta: object;
        errorShape: DefaultErrorShape;
    }>>;
    add: DecorateMutationProcedure<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, MutationProcedure<...>>;
}
infinitePosts
.
list: DecorateQueryProcedure<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, QueryProcedure<{
    input: {
        limit?: number | null | undefined;
        cursor?: number | null | undefined;
        direction?: "forward" | "backward" | undefined;
    };
    output: {
        items: {
            id: string;
            title: string;
            status: string;
        }[];
        nextCursor: number | undefined;
    };
    meta: object;
    errorShape: DefaultErrorShape;
}>>
list
.
function getInfiniteData(input?: {
    limit?: number | null | undefined;
    cursor?: number | null | undefined;
    direction?: "forward" | "backward" | undefined;
} | undefined): InfiniteData<{
    items: {
        id: string;
        title: string;
        status: string;
    }[];
    nextCursor?: number | undefined;
}, number | null> | undefined
getInfiniteData
({ limit?: number | null | undefinedlimit: 10 });
// [...] }, }); }

setInfiniteData()

This helper allows you to update a query's cached data

components/MyComponent.tsx
import { 
const trpc: CreateTRPCReactBase<BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    infinitePosts: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        list: QueryProcedure<{
            input: {
                limit?: number | null | undefined;
                cursor?: number | null | undefined;
                direction?: "forward" | "backward" | undefined;
            };
            output: {
                items: {
                    id: string;
                    title: string;
                    status: string;
                }[];
                nextCursor: number | undefined;
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        delete: MutationProcedure<...>;
    }>>;
}>>, unknown> & DecorateRouterRecord<...>
trpc
} from '../utils/trpc';
export function function MyComponent(): voidMyComponent() { const
const utils: TRPCContextPropsBase<BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    infinitePosts: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        list: QueryProcedure<{
            input: {
                limit?: number | null | undefined;
                cursor?: number | null | undefined;
                direction?: "forward" | "backward" | undefined;
            };
            output: {
                items: {
                    id: string;
                    title: string;
                    status: string;
                }[];
                nextCursor: number | undefined;
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        delete: MutationProcedure<...>;
    }>>;
}>>, unknown> & {
    ...;
} & DecorateRouter & {
    ...;
}
utils
=
const trpc: CreateTRPCReactBase<BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    infinitePosts: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        list: QueryProcedure<{
            input: {
                limit?: number | null | undefined;
                cursor?: number | null | undefined;
                direction?: "forward" | "backward" | undefined;
            };
            output: {
                items: {
                    id: string;
                    title: string;
                    status: string;
                }[];
                nextCursor: number | undefined;
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        delete: MutationProcedure<...>;
    }>>;
}>>, unknown> & DecorateRouterRecord<...>
trpc
.
function useUtils(): TRPCContextPropsBase<BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    infinitePosts: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        list: QueryProcedure<{
            input: {
                limit?: number | null | undefined;
                cursor?: number | null | undefined;
                direction?: "forward" | "backward" | undefined;
            };
            output: {
                items: {
                    id: string;
                    title: string;
                    status: string;
                }[];
                nextCursor: number | undefined;
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        delete: MutationProcedure<...>;
    }>>;
}>>, unknown> & {
    ...;
} & DecorateRouter & {
    ...;
}
useUtils
();
const
const myMutation: UseTRPCMutationResult<{
    id: string;
}, TRPCClientErrorLike<{
    input: {
        id: string;
    };
    output: {
        id: string;
    };
    transformer: false;
    errorShape: DefaultErrorShape;
}>, {
    id: string;
}, void>
myMutation
=
const trpc: CreateTRPCReactBase<BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    infinitePosts: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        list: QueryProcedure<{
            input: {
                limit?: number | null | undefined;
                cursor?: number | null | undefined;
                direction?: "forward" | "backward" | undefined;
            };
            output: {
                items: {
                    id: string;
                    title: string;
                    status: string;
                }[];
                nextCursor: number | undefined;
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        delete: MutationProcedure<...>;
    }>>;
}>>, unknown> & DecorateRouterRecord<...>
trpc
.
infinitePosts: DecorateRouterRecord<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    list: QueryProcedure<{
        input: {
            limit?: number | null | undefined;
            cursor?: number | null | undefined;
            direction?: "forward" | "backward" | undefined;
        };
        output: {
            items: {
                id: string;
                title: string;
                status: string;
            }[];
            nextCursor: number | undefined;
        };
        meta: object;
        errorShape: DefaultErrorShape;
    }>;
    delete: MutationProcedure<{
        input: {
            id: string;
        };
        output: {
            id: string;
        };
        meta: object;
        errorShape: DefaultErrorShape;
    }>;
}>>
infinitePosts
.
delete: DecoratedMutation<{
    input: {
        id: string;
    };
    output: {
        id: string;
    };
    transformer: false;
    errorShape: DefaultErrorShape;
}>
delete
.
useMutation: <void>(opts?: UseTRPCMutationOptions<{
    id: string;
}, TRPCClientErrorLike<{
    input: {
        id: string;
    };
    output: {
        id: string;
    };
    transformer: false;
    errorShape: DefaultErrorShape;
}>, {
    id: string;
}, void> | undefined) => UseTRPCMutationResult<{
    id: string;
}, TRPCClientErrorLike<{
    input: {
        id: string;
    };
    output: {
        id: string;
    };
    transformer: false;
    errorShape: DefaultErrorShape;
}>, {
    id: string;
}, void>
useMutation
({
async
onMutate?: ((variables: {
    id: string;
}, context: MutationFunctionContext) => void | Promise<void>) | undefined
onMutate
(
opts: {
    id: string;
}
opts
) {
await
const utils: TRPCContextPropsBase<BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    infinitePosts: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        list: QueryProcedure<{
            input: {
                limit?: number | null | undefined;
                cursor?: number | null | undefined;
                direction?: "forward" | "backward" | undefined;
            };
            output: {
                items: {
                    id: string;
                    title: string;
                    status: string;
                }[];
                nextCursor: number | undefined;
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        delete: MutationProcedure<...>;
    }>>;
}>>, unknown> & {
    ...;
} & DecorateRouter & {
    ...;
}
utils
.
infinitePosts: DecorateRouter & {
    list: DecorateQueryProcedure<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, QueryProcedure<{
        input: {
            limit?: number | null | undefined;
            cursor?: number | null | undefined;
            direction?: "forward" | "backward" | undefined;
        };
        output: {
            items: {
                id: string;
                title: string;
                status: string;
            }[];
            nextCursor: number | undefined;
        };
        meta: object;
        errorShape: DefaultErrorShape;
    }>>;
    delete: DecorateMutationProcedure<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, MutationProcedure<...>>;
}
infinitePosts
.
list: DecorateQueryProcedure<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, QueryProcedure<{
    input: {
        limit?: number | null | undefined;
        cursor?: number | null | undefined;
        direction?: "forward" | "backward" | undefined;
    };
    output: {
        items: {
            id: string;
            title: string;
            status: string;
        }[];
        nextCursor: number | undefined;
    };
    meta: object;
    errorShape: DefaultErrorShape;
}>>
list
.
function cancel(input?: {
    limit?: number | null | undefined;
    cursor?: number | null | undefined;
    direction?: "forward" | "backward" | undefined;
} | undefined, options?: CancelOptions): Promise<void>
cancel
();
const utils: TRPCContextPropsBase<BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, DecorateCreateRouterOptions<{
    infinitePosts: BuiltRouter<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, DecorateCreateRouterOptions<{
        list: QueryProcedure<{
            input: {
                limit?: number | null | undefined;
                cursor?: number | null | undefined;
                direction?: "forward" | "backward" | undefined;
            };
            output: {
                items: {
                    id: string;
                    title: string;
                    status: string;
                }[];
                nextCursor: number | undefined;
            };
            meta: object;
            errorShape: DefaultErrorShape;
        }>;
        delete: MutationProcedure<...>;
    }>>;
}>>, unknown> & {
    ...;
} & DecorateRouter & {
    ...;
}
utils
.
infinitePosts: DecorateRouter & {
    list: DecorateQueryProcedure<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, QueryProcedure<{
        input: {
            limit?: number | null | undefined;
            cursor?: number | null | undefined;
            direction?: "forward" | "backward" | undefined;
        };
        output: {
            items: {
                id: string;
                title: string;
                status: string;
            }[];
            nextCursor: number | undefined;
        };
        meta: object;
        errorShape: DefaultErrorShape;
    }>>;
    delete: DecorateMutationProcedure<{
        ctx: object;
        meta: object;
        errorShape: DefaultErrorShape;
        transformer: false;
    }, MutationProcedure<...>>;
}
infinitePosts
.
list: DecorateQueryProcedure<{
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}, QueryProcedure<{
    input: {
        limit?: number | null | undefined;
        cursor?: number | null | undefined;
        direction?: "forward" | "backward" | undefined;
    };
    output: {
        items: {
            id: string;
            title: string;
            status: string;
        }[];
        nextCursor: number | undefined;
    };
    meta: object;
    errorShape: DefaultErrorShape;
}>>
list
.
function setInfiniteData(input: {
    limit?: number | null | undefined;
    cursor?: number | null | undefined;
    direction?: "forward" | "backward" | undefined;
}, updater: Updater<InfiniteData<{
    items: {
        id: string;
        title: string;
        status: string;
    }[];
    nextCursor?: number | undefined;
}, number | null> | undefined, InfiniteData<{
    items: {
        id: string;
        title: string;
        status: string;
    }[];
    nextCursor?: number | undefined;
}, number | null> | undefined>, options?: SetDataOptions): void
setInfiniteData
({ limit?: number | null | undefinedlimit: 10 }, (
data: InfiniteData<{
    items: {
        id: string;
        title: string;
        status: string;
    }[];
    nextCursor?: number | undefined;
}, number | null> | undefined
data
) => {
if (!
data: InfiniteData<{
    items: {
        id: string;
        title: string;
        status: string;
    }[];
    nextCursor?: number | undefined;
}, number | null> | undefined
data
) {
return {
InfiniteData<{ items: { id: string; title: string; status: string; }[]; nextCursor?: number | undefined; }, number | null>.pages: {
    items: {
        id: string;
        title: string;
        status: string;
    }[];
    nextCursor?: number | undefined;
}[]
pages
: [],
InfiniteData<{ items: { id: string; title: string; status: string; }[]; nextCursor?: number | undefined; }, number | null>.pageParams: (number | null)[]pageParams: [], }; } return { ...
data: InfiniteData<{
    items: {
        id: string;
        title: string;
        status: string;
    }[];
    nextCursor?: number | undefined;
}, number | null>
data
,
InfiniteData<{ items: { id: string; title: string; status: string; }[]; nextCursor?: number | undefined; }, number | null>.pages: {
    items: {
        id: string;
        title: string;
        status: string;
    }[];
    nextCursor?: number | undefined;
}[]
pages
:
data: InfiniteData<{
    items: {
        id: string;
        title: string;
        status: string;
    }[];
    nextCursor?: number | undefined;
}, number | null>
data
.
InfiniteData<{ items: { id: string; title: string; status: string; }[]; nextCursor?: number | undefined; }, number | null>.pages: {
    items: {
        id: string;
        title: string;
        status: string;
    }[];
    nextCursor?: number | undefined;
}[]
pages
.
Array<{ items: { id: string; title: string; status: string; }[]; nextCursor?: number | undefined; }>.map<{
    items: {
        id: string;
        title: string;
        status: string;
    }[];
    nextCursor?: number | undefined;
}>(callbackfn: (value: {
    items: {
        id: string;
        title: string;
        status: string;
    }[];
    nextCursor?: number | undefined;
}, index: number, array: {
    items: {
        id: string;
        title: string;
        status: string;
    }[];
    nextCursor?: number | undefined;
}[]) => {
    items: {
        id: string;
        title: string;
        status: string;
    }[];
    nextCursor?: number | undefined;
}, thisArg?: any): {
    items: {
        id: string;
        title: string;
        status: string;
    }[];
    nextCursor?: number | undefined;
}[]
map
((
page: {
    items: {
        id: string;
        title: string;
        status: string;
    }[];
    nextCursor?: number | undefined;
}
page
) => ({
...
page: {
    items: {
        id: string;
        title: string;
        status: string;
    }[];
    nextCursor?: number | undefined;
}
page
,
items: {
    id: string;
    title: string;
    status: string;
}[]
items
:
page: {
    items: {
        id: string;
        title: string;
        status: string;
    }[];
    nextCursor?: number | undefined;
}
page
.
items: {
    id: string;
    title: string;
    status: string;
}[]
items
.
Array<{ id: string; title: string; status: string; }>.filter(predicate: (value: {
    id: string;
    title: string;
    status: string;
}, index: number, array: {
    id: string;
    title: string;
    status: string;
}[]) => unknown, thisArg?: any): {
    id: string;
    title: string;
    status: string;
}[] (+1 overload)
filter
((
item: {
    id: string;
    title: string;
    status: string;
}
item
) =>
item: {
    id: string;
    title: string;
    status: string;
}
item
.status: stringstatus === 'published'),
})), }; }); }, }); // [...] }