Replies: 4 comments 2 replies
-
I agree. That's how import { loader as rootLoader } from '~/root'
const rootData = useTypedRouteLoaderData<typeof rootLoader>('root') https://github.com/kiliman/remix-typedjson#usetypedrouteloaderdata |
Beta Was this translation helpful? Give feedback.
-
The problem is that /**
* Returns the loaderData for the given routeId
*/
export function useRouteLoaderData(routeId: string): unknown {
let state = useDataRouterState(DataRouterStateHook.UseRouteLoaderData);
return state.loaderData[routeId];
} So you'll never have a nicely type safe hook you can get data with. Of course you can just cast it with the You can cast it using the as keywork, as such import { type SerializeFrom } from '@remix-run/node'
import { useRouteLoaderData } from '@remix-run/react'
import type { loader } from '~/routes/me'
export default function Page() {
const user = useRouteLoaderData('routes/me') as SerializeFrom<typeof loader>
return (
<>
<h1>Welcome, {user.name}</h1>
</>
)
} And if you really want to, you could make a wrapper function accepting a generic. function useTypedRouteLoaderData<T>(route: string) {
return useRouteLoaderData(route) as SerializeFrom<T> | underfined
} In that regard, I much prefer how frameworks like sveltekit handle this. Wonder if something similar could be possible with remix. Maybe have some types being generated by remix on the fly. |
Beta Was this translation helpful? Give feedback.
-
This would be super helpful! |
Beta Was this translation helpful? Give feedback.
-
So I ended up making my own import { useRouteLoaderData } from '@remix-run/react'
import type { SerializeFrom } from '@remix-run/node'
import type { loader as RouteAuthLoader } from '~/routes/auth'
import type { loader as RouteMeLoader } from '~/routes/me'
type Loaders = {
'routes/auth': typeof RouteAuthLoader
'routes/me': typeof RouteMeLoader
}
export function useTypedRouteLoaderData<T extends keyof Loaders>(route: T) {
return useRouteLoaderData(route) as SerializeFrom<Loaders[T]>
} |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
-
Just like
useLoaderData
can be used as suchuseLoaderData<typeof loader>()
,I believe it would make sense that the new
useRouteLoaderData
can also be used in this way.Beta Was this translation helpful? Give feedback.
All reactions