diff --git a/packages/next/navigation-types/compat/navigation.d.ts b/packages/next/navigation-types/compat/navigation.d.ts index 19cf7e640fb22..e2e225d2e664d 100644 --- a/packages/next/navigation-types/compat/navigation.d.ts +++ b/packages/next/navigation-types/compat/navigation.d.ts @@ -25,5 +25,10 @@ declare module 'next/navigation' { * * If used from `pages/`, the hook will return `null`. */ - export function useParams(): Record | null + export function useParams< + T extends Record = Record< + string, + string | string[] + > + >(): T | null } diff --git a/packages/next/src/client/components/navigation.ts b/packages/next/src/client/components/navigation.ts index 4fdd7416297b0..ab62869024f4d 100644 --- a/packages/next/src/client/components/navigation.ts +++ b/packages/next/src/client/components/navigation.ts @@ -164,14 +164,14 @@ function getSelectedParams( * Get the current parameters. For example useParams() on /dashboard/[team] * where pathname is /dashboard/nextjs would return { team: 'nextjs' } */ -export function useParams(): Params { +export function useParams(): T { clientHookInServerComponentError('useParams') const globalLayoutRouterContext = useContext(GlobalLayoutRouterContext) if (!globalLayoutRouterContext) { // This only happens in `pages`. Type is overwritten in navigation.d.ts return null! } - return getSelectedParams(globalLayoutRouterContext.tree) + return getSelectedParams(globalLayoutRouterContext.tree) as T } // TODO-APP: handle parallel routes