© 2026 Hedgehog Software, LLC

TwitterGitHubDiscord
More
CommunitiesDocsAboutTermsPrivacy
Search
Star
Setup for Free
Drizzle TeamDT
Drizzle Team•2y ago
stefan

withPagination type inference

Looking for help as to why my types on this withPagination function are not getting inferred correctly. Data does on the
PaginatedResult
PaginatedResult
does not get full inferred at the top level.

pagination.ts
pagination.ts

import type { PgSelect } from 'drizzle-orm/pg-core'
import { db } from './db'
import { count } from 'drizzle-orm'

export interface PaginatedOptions {
    page?: number
    perPage?: number
}

export interface PaginatedResult<T> {
    data: T[]
    page: number
    perPage: number
    pageCount: number
    totalCount: number
}

export async function withPagination<T extends PgSelect>(
    qb: T,
    pagination?: PaginatedOptions
): Promise<PaginatedResult<T>> {
    const page = pagination?.page ?? 1
    const perPage = pagination?.perPage ?? 10
    const query = qb.limit(perPage).offset((page - 1) * perPage)
    const sq = db.$with('sq').as(query)

    const data = (await query.execute()) as T[]
    const meta = await db.select({ count: count() }).from(sq)

    const totalCount = Number(meta[0].count)
    const pageCount = Math.ceil(totalCount / perPage)

    return {
        data,
        totalCount,
        pageCount,
        perPage,
        page,
    }
}
import type { PgSelect } from 'drizzle-orm/pg-core'
import { db } from './db'
import { count } from 'drizzle-orm'

export interface PaginatedOptions {
    page?: number
    perPage?: number
}

export interface PaginatedResult<T> {
    data: T[]
    page: number
    perPage: number
    pageCount: number
    totalCount: number
}

export async function withPagination<T extends PgSelect>(
    qb: T,
    pagination?: PaginatedOptions
): Promise<PaginatedResult<T>> {
    const page = pagination?.page ?? 1
    const perPage = pagination?.perPage ?? 10
    const query = qb.limit(perPage).offset((page - 1) * perPage)
    const sq = db.$with('sq').as(query)

    const data = (await query.execute()) as T[]
    const meta = await db.select({ count: count() }).from(sq)

    const totalCount = Number(meta[0].count)
    const pageCount = Math.ceil(totalCount / perPage)

    return {
        data,
        totalCount,
        pageCount,
        perPage,
        page,
    }
}


user.service.ts
user.service.ts

export async function list(filters?: any, pagination?: PaginatedOptions) {
     const query = db.select().from(userTable).$dynamic()
     return await withPagination(query, pagination)
 }
export async function list(filters?: any, pagination?: PaginatedOptions) {
     const query = db.select().from(userTable).$dynamic()
     return await withPagination(query, pagination)
 }


api.ts
api.ts

import { Hono } from 'hono'
import { handle } from 'hono/aws-lambda'
import { user } from '@rally/core'

const app = new Hono()

app.get('/', async (c) => {
    // data here is type any
    const { data: users } = await user.list()
})

export const handler = handle(app)
import { Hono } from 'hono'
import { handle } from 'hono/aws-lambda'
import { user } from '@rally/core'

const app = new Hono()

app.get('/', async (c) => {
    // data here is type any
    const { data: users } = await user.list()
})

export const handler = handle(app)
Drizzle TeamJoin
The official Discord for all Drizzle related projects, such as Drizzle ORM, Drizzle Kit, Drizzle Studio and more!
11,879Members
Resources
Was this page helpful?

Similar Threads

Recent Announcements

Similar Threads

Invalid type inference when using helpers
Drizzle TeamDTDrizzle Team / help
14mo ago
Returned type inference when using tanstack query
Drizzle TeamDTDrizzle Team / help
2y ago
Are dynamic selects with type inference possible?
Drizzle TeamDTDrizzle Team / help
2y ago
No type inference when specifying a reference.
Drizzle TeamDTDrizzle Team / help
2y ago