TypeScript 中规范 Vue Router 路由配置类型的核心是实现路由名称、参数、meta 和组件的静态检查。推荐使用 unplugin-vue-router 自动生成 typed-router.d.ts,支持文件系统约定式路由与精确的 RouteNamedMap 类型推导;小项目可手写 RouteNamedMap 接口配合 createRouter 泛型;启用 props: true 实现 params 到组件 props 的类型贯通;为 meta 定义统一 RouteMeta 接口以增强守卫和标题管理的类型安全。

在 TypeScript 中规范 Vue Router 的路由配置类型,核心目标是让路由名称、参数、元信息和组件都能被静态检查,避免运行时因拼错 name、漏传 params 或误读 meta 而引发的错误。这不是加几个 interface 就完事,而是要建立一套可推导、可复用、能随文件增减自动更新的类型体系。
用 unplugin-vue-router 自动生成类型定义
这是目前最主流、最省心的方案。它基于文件系统约定(如 src/pages/user/[id]/index.vue → 自动映射为 /user/:id),在构建时扫描所有页面组件,生成完整的 typed-router.d.ts 文件。
- 安装插件:
npm install -D unplugin-vue-router - 在
vite.config.ts中启用:VueRouter({ dts: 'src/typed-router.d.ts' }) - 无需手动写
routes数组,直接导入自动生成的routes:import { routes } from 'vue-router/auto-routes' - 生成的类型包含精确的
RouteNamedMap,比如{ userId: string }会作为params类型绑定到name: 'UserProfile'上
手动定义 RouteNamedMap 接口(适合小项目或特殊场景)
当需要精细控制某些动态嵌套路由、或部分路由不走文件约定时,可手写 RouteNamedMap 并配合 createRouter 的泛型使用。
使用 Scrapfly SDK(scrapfly-sdk)在 TypeScript 或 JavaScript 中进行网页抓取,用于用户请求抓取 URL、绕过反爬虫防护、渲染页面等场景。
- 在
src/router/types.ts中声明: export interface RouteNamedMap {Home: {};UserProfile: { id: string; tab?: 'posts' | 'settings' };AdminDashboard: { section: 'users' | 'roles' | 'logs' };}- 创建 router 实例时指定泛型:
createRouter<routelocationnormalizedloaded routenamedmap>({ routes })</routelocationnormalizedloaded> - 这样
router.push({ name: 'UserProfile', params: { id: 123 } })就会报错——因为id必须是string
路由参数与组件 props 类型对齐
别再从 useRoute().params 里手动取值并断言类型。推荐开启 props: true,让 Vue Router 自动把 params 注入为组件 props,实现端到端类型贯通。
立即学习“前端免费学习笔记(深入)”;
- 路由配置中加
props: true或props: (route) => ({ id: Number(route.params.id) }) - 组件内用
defineProps<{ id: number }>()直接接收,IDE 有补全,TS 有校验 - 比
const { id } = useRoute().params更安全,也更符合组合式 API 的类型习惯
meta 字段类型化与守卫联动
meta 不该是任意对象。为它定义统一接口,能让路由守卫、标题管理、权限判断等逻辑获得类型提示。
- 定义
interface RouteMeta { title: string; requiresAuth?: boolean; permission?: string[]; layout?: 'default' | 'blank'; } - 每个路由配置都标注
meta: { title: '用户管理', requiresAuth: true, permission: ['user:read'] } - 在全局守卫中可安全访问:
if (to.meta.requiresAuth && !isLogin()) { ... },不再担心属性名拼错 - 配合
to.meta.title更新 document.title,也支持 i18n key 类型约束(如title: I18nKey)


















