Skip to content

Type Safety ​

Use router registration to type imports from @kitbag/router, or create router assets for a specific router. Both approaches provide route names, params, and loader data types from your route definitions.

Registration ​

Extend the Register interface with your router's type. Components, composables, and reusable callbacks imported from @kitbag/router will then use that router's types.

ts
import { createRouter } from '@kitbag/router'
import { routes } from './routes'

export const router = createRouter(routes)

declare module '@kitbag/router' {
  interface Register {
    router: typeof router
  }
}

Router Assets ​

Use createRouterAssets to get exports typed for a specific router, such as when an application uses multiple routers. Import the resulting exports from your own module instead of @kitbag/router.

ts
// routerAssets.ts
import { createRouterAssets } from '@kitbag/router'
import { router } from './router'

export const {
  RouterLink,
  RouterView,
  useRoute,
  useRouter,
  createLoader,
  createView,
  createHook,
} = createRouterAssets(router)

Circular type inference ​

When using registration or router assets, explicitly type reusable loaders with Loader<Data> and views with View<Props> to avoid circular type inference.

ts
import { createLoader, type Loader } from '@kitbag/router'
import { getSession, type Session } from './api'

const sessionLoader: Loader<Promise<Session>> = createLoader({
  load: () => getSession(),
})
ts
import { createView, type View } from '@kitbag/router'
import PageComponent from './PageComponent.vue'

const pageView: View<{ url: string }> = createView({
  component: PageComponent,
  props: (route) => ({ url: String(route.href) }),
})