diff --git a/packages/react-router/src/useRouteContext.ts b/packages/react-router/src/useRouteContext.ts index a77a5935d9..435e542475 100644 --- a/packages/react-router/src/useRouteContext.ts +++ b/packages/react-router/src/useRouteContext.ts @@ -1,6 +1,8 @@ import { useMatch } from './useMatch' +import type { ThrowConstraint } from './useMatch' import type { AnyRouter, RegisteredRouter } from './router' import type { + ThrowOrOptional, UseRouteContextBaseOptions, UseRouteContextOptions, UseRouteContextResult, @@ -10,20 +12,33 @@ export type UseRouteContextRoute = < TRouter extends AnyRouter = RegisteredRouter, TSelected = unknown, >( - opts?: UseRouteContextBaseOptions, + opts?: UseRouteContextBaseOptions, ) => UseRouteContextResult export function useRouteContext< TRouter extends AnyRouter = RegisteredRouter, const TFrom extends string | undefined = undefined, TStrict extends boolean = true, + TThrow extends boolean = true, TSelected = unknown, >( - opts: UseRouteContextOptions, -): UseRouteContextResult { + opts: UseRouteContextOptions< + TRouter, + TFrom, + TStrict, + ThrowConstraint, + TSelected + >, +): ThrowOrOptional< + UseRouteContextResult, + TThrow +> { return useMatch({ ...(opts as any), select: (match) => opts.select ? opts.select(match.context) : match.context, - }) as UseRouteContextResult + }) as ThrowOrOptional< + UseRouteContextResult, + TThrow + > } diff --git a/packages/react-router/tests/useRouteContext.test-d.tsx b/packages/react-router/tests/useRouteContext.test-d.tsx index 7d0a14ef4a..6e4d5139f5 100644 --- a/packages/react-router/tests/useRouteContext.test-d.tsx +++ b/packages/react-router/tests/useRouteContext.test-d.tsx @@ -130,8 +130,12 @@ test('when there is the root context', () => { .toEqualTypeOf<((search: { userId?: string }) => unknown) | undefined>() expectTypeOf( - useRouteContext, + useRouteContext, ).returns.toEqualTypeOf() + + expectTypeOf( + useRouteContext, + ).returns.toEqualTypeOf() }) test('when there are multiple contexts', () => { diff --git a/packages/router-core/src/useRouteContext.ts b/packages/router-core/src/useRouteContext.ts index 8cfcd197ce..9fd72c967f 100644 --- a/packages/router-core/src/useRouteContext.ts +++ b/packages/router-core/src/useRouteContext.ts @@ -6,20 +6,23 @@ export interface UseRouteContextBaseOptions< TRouter extends AnyRouter, TFrom, TStrict extends boolean, + TThrow extends boolean, TSelected, > { select?: ( search: ResolveUseRouteContext, ) => TSelected + shouldThrow?: TThrow } export type UseRouteContextOptions< TRouter extends AnyRouter, TFrom extends string | undefined, TStrict extends boolean, + TThrow extends boolean, TSelected, > = StrictOrFrom & - UseRouteContextBaseOptions + UseRouteContextBaseOptions export type ResolveUseRouteContext< TRouter extends AnyRouter, diff --git a/packages/solid-router/src/useRouteContext.ts b/packages/solid-router/src/useRouteContext.ts index 0ae39977d6..109fe0d5e9 100644 --- a/packages/solid-router/src/useRouteContext.ts +++ b/packages/solid-router/src/useRouteContext.ts @@ -12,16 +12,17 @@ export type UseRouteContextRoute = < TRouter extends AnyRouter = RegisteredRouter, TSelected = unknown, >( - opts?: UseRouteContextBaseOptions, + opts?: UseRouteContextBaseOptions, ) => Accessor> export function useRouteContext< TRouter extends AnyRouter = RegisteredRouter, const TFrom extends string | undefined = undefined, TStrict extends boolean = true, + TThrow extends boolean = true, TSelected = unknown, >( - opts: UseRouteContextOptions, + opts: UseRouteContextOptions, ): Accessor> { return useMatch({ ...(opts as any),