Skip to content
该翻译已同步到了 的版本,其对应的 commit hash 是 d842b6f

类型化路由 v4.4.0+

RouterLink to autocomplete

可以为路由配置一个类型化的映射表。 虽然可以手动实现,但更推荐使用 unplugin-vue-router 插件来自动生成路由及其类型。

手动配置

以下是一个手动配置类型化路由的示例:

ts
// 要为你的路由添加类型,需要从 vue-router 导入 `RouteRecordInfo` 类型
import type { RouteRecordInfo } from 'vue-router'

// 定义一个路由的 interface
export interface RouteNamedMap {
  // 每一个键都是一个名称
  home: RouteRecordInfo<
    // 这里我们的名称是相同的
    'home',
    // 这是路径,它会出现在自动补全中
    '/',
    // 这些是原始参数(可以传递给 router.push() 和 RouterLink 的 "to" 属性)
    // 在这种情况下,不允许有任何参数
    Record<never, never>,
    // 这些是标准化后的参数(即通过 `useRoute()` 获取到的参数)
    Record<never, never>,
    // 这是一个所有子路由名称的联合类型,而在本例中,没有子路由
    never
  >
  // 对每一条路由都要重复这个步骤……
  // 注意,你可以随意为它们命名
  'named-param': RouteRecordInfo<
    'named-param',
    '/:name',
    { name: string | number }, // 允许是字符串或数字
    { name: string }, // 但从 URL 获取时始终为字符串
    'named-param-edit'
  >
  'named-param-edit': RouteRecordInfo<
    'named-param-edit',
    '/:name/edit',
    { name: string | number }, // 我们还需要包含父级路由的参数
    { name: string },
    never
  >
  'article-details': RouteRecordInfo<
    'article-details',
    '/articles/:id+',
    { id: Array<number | string> },
    { id: string[] },
    never
  >
  'not-found': RouteRecordInfo<
    'not-found',
    '/:path(.*)',
    { path: string },
    { path: string },
    never
  >
}

// 最后,你需要把这份路由映射表扩展到 Vue Router 的类型定义中
declare module 'vue-router' {
  interface TypesConfig {
    RouteNamedMap: RouteNamedMap
  }
}

TIP

这种方式确实繁琐且容易出错。正因如此,强烈推荐使用 unplugin-vue-router 来自动生成路由和类型。

Released under the MIT License.