T
TanStack•3mo ago
extended-salmon

Why isn't my context typed

import { createRouter as createTanstackRouter } from "@tanstack/react-router";

import { routeTree } from "./routeTree.gen";

import "./styles.css";
import { ConvexQueryClient } from "@convex-dev/react-query";
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import { ConvexProviderWithAuth, ConvexReactClient } from "convex/react";
import { useAuthFromProvider } from "@/hooks/useAuthFromProvider";
import { AuthKitProvider } from "@workos-inc/authkit-react";

export const createRouter = () => {
const CONVEX_URL = String(import.meta.env.VITE_CONVEX_URL);
const WORKOS_CLIENT_ID = String(import.meta.env.VITE_WORKOS_CLIENT_ID);

if (!CONVEX_URL) {
console.error("missing envar CONVEX_URL");
}

if (!WORKOS_CLIENT_ID) {
console.error("missing envar WORKOS_CLIENT_ID");
}

const convexClient = new ConvexReactClient(CONVEX_URL);
const convexQueryClient = new ConvexQueryClient(convexClient);
const queryClient = new QueryClient({
defaultOptions: {
queries: {
queryKeyHashFn: convexQueryClient.hashFn(),
queryFn: convexQueryClient.queryFn(),
},
},
});
convexQueryClient.connect(queryClient);

const router = createTanstackRouter({
routeTree,
scrollRestoration: true,
defaultPreload: "intent",
defaultPreloadStaleTime: 0,
context: {
queryClient,
convexClient,
convexQueryClient,
},
Wrap(props) {
return (
<AuthKitProvider clientId={WORKOS_CLIENT_ID}>
<ConvexProviderWithAuth
client={convexClient}
useAuth={useAuthFromProvider}
>
<QueryClientProvider client={queryClient}>
{props.children}
</QueryClientProvider>
</ConvexProviderWithAuth>
</AuthKitProvider>
);
},
});

return router;
};

declare module "@tanstack/react-router" {
interface Register {
router: ReturnType<typeof createRouter>;
}
}
import { createRouter as createTanstackRouter } from "@tanstack/react-router";

import { routeTree } from "./routeTree.gen";

import "./styles.css";
import { ConvexQueryClient } from "@convex-dev/react-query";
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import { ConvexProviderWithAuth, ConvexReactClient } from "convex/react";
import { useAuthFromProvider } from "@/hooks/useAuthFromProvider";
import { AuthKitProvider } from "@workos-inc/authkit-react";

export const createRouter = () => {
const CONVEX_URL = String(import.meta.env.VITE_CONVEX_URL);
const WORKOS_CLIENT_ID = String(import.meta.env.VITE_WORKOS_CLIENT_ID);

if (!CONVEX_URL) {
console.error("missing envar CONVEX_URL");
}

if (!WORKOS_CLIENT_ID) {
console.error("missing envar WORKOS_CLIENT_ID");
}

const convexClient = new ConvexReactClient(CONVEX_URL);
const convexQueryClient = new ConvexQueryClient(convexClient);
const queryClient = new QueryClient({
defaultOptions: {
queries: {
queryKeyHashFn: convexQueryClient.hashFn(),
queryFn: convexQueryClient.queryFn(),
},
},
});
convexQueryClient.connect(queryClient);

const router = createTanstackRouter({
routeTree,
scrollRestoration: true,
defaultPreload: "intent",
defaultPreloadStaleTime: 0,
context: {
queryClient,
convexClient,
convexQueryClient,
},
Wrap(props) {
return (
<AuthKitProvider clientId={WORKOS_CLIENT_ID}>
<ConvexProviderWithAuth
client={convexClient}
useAuth={useAuthFromProvider}
>
<QueryClientProvider client={queryClient}>
{props.children}
</QueryClientProvider>
</ConvexProviderWithAuth>
</AuthKitProvider>
);
},
});

return router;
};

declare module "@tanstack/react-router" {
interface Register {
router: ReturnType<typeof createRouter>;
}
}
I'm trying to figure out why my context is not typed, I seem to have set up everything like suggested in the documentation
No description
12 Replies
conscious-sapphire
conscious-sapphire•3mo ago
do you use createRootRouteWithContext in __root ?
extended-salmon
extended-salmonOP•3mo ago
No, my __root is createRootRout should it be with context?
conscious-sapphire
conscious-sapphire•3mo ago
yes since you want ... context 😄
conscious-sapphire
conscious-sapphire•3mo ago
createRootRouteWithContext function | TanStack Router React Docs
The createRootRouteWithContext function is a helper function that can be used to create a root route instance that requires a context type to be fulfilled when the router is created. createRootRouteWi...
extended-salmon
extended-salmonOP•3mo ago
I see but I don't understand how that would affect the type other files
conscious-sapphire
conscious-sapphire•3mo ago
be aware of the extra ()
extended-salmon
extended-salmonOP•3mo ago
if I log the context in my routes it has the context but it's just not typed appropriately
conscious-sapphire
conscious-sapphire•3mo ago
the type for the router context needs to come from somewhere and createRootRouteWithContext is the way to provide that type
extended-salmon
extended-salmonOP•3mo ago
Hmm ok so I changed it to createRootRouteWithContext but the types are still not in my other other file routes when I hover the return type of create router I get something like this
const createRouter: () => RouterCore<Route<any, "/", "/", string, "__root__", undefined, {}, {}, AnyContext, AnyContext, {}, undefined, RootRouteChildren, FileRouteTypes>, "never", false, RouterHistory, Record<...>>
const createRouter: () => RouterCore<Route<any, "/", "/", string, "__root__", undefined, {}, {}, AnyContext, AnyContext, {}, undefined, RootRouteChildren, FileRouteTypes>, "never", false, RouterHistory, Record<...>>
conscious-sapphire
conscious-sapphire•3mo ago
did you specify the generic?
extended-salmon
extended-salmonOP•3mo ago
Ok I see, so the generic has to be passed into createRootRouteWithContext I thought the context could be infered from what values you passed into context when using createTanstackRouter It's working now, thank you!
conscious-sapphire
conscious-sapphire•3mo ago
no unfortunately not that's the one place where you need to actually write typescript in router 😄

Did you find this page helpful?