---
title: Type Safety
---
# Type Safety
[MODES: framework]
If you haven't done so already, check out our guide for [setting up type safety][route-module-type-safety] in a new project.
React Router generates types for each route in your app to provide type safety for the route module exports.
For example, let's say you have a `products/:id` route configured:
```ts filename=app/routes.ts
import {
type RouteConfig,
route,
} from "@react-router/dev/routes";
export default [
route("products/:id", "./routes/product.tsx"),
] satisfies RouteConfig;
```
You can import route-specific types like so:
```tsx filename=app/routes/product.tsx
import type { Route } from "./+types/product";
// types generated for this route 👆
export function loader({ params }: Route.LoaderArgs) {
// 👆 { id: string }
return { planet: `world #${params.id}` };
}
export default function Component({
loaderData, // 👈 { planet: string }
}: Route.ComponentProps) {
return
Hello, {loaderData.planet}!
;
}
```
## How it works
React Router's type generation executes your route config (`app/routes.ts` by default) to determine the routes for your app.
It then generates a `+types/.d.ts` for each route within a special `.react-router/types/` directory.
With [`rootDirs` configured][route-module-type-safety], TypeScript can import these generated files as if they were right next to their corresponding route modules.
For a deeper dive into some of the design decisions, check out our [type inference decision doc](https://github.com/remix-run/react-router/blob/dev/decisions/0012-type-inference.md).
[route-module-type-safety]: ../how-to/route-module-type-safety
## `typegen` command
You can manually generate types with the `typegen` command:
```sh
react-router typegen
```
The following types are generated for each route:
- `LoaderArgs`
- `ClientLoaderArgs`
- `ActionArgs`
- `ClientActionArgs`
- `HydrateFallbackProps`
- `ComponentProps` (for the `default` export)
- `ErrorBoundaryProps`
### --watch
If you run `react-router dev` — or if your custom server calls `vite.createServer` — then React Router's Vite plugin is already generating up-to-date types for you.
But if you really need to run type generation on its own, you can also use `--watch` to automatically regenerate types as files change:
```sh
react-router typegen --watch
```