You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript中通过函数参数推断路由对象键类型的报错问题

TypeScript 路由路径函数的联合类型索引问题

问题描述

我需要实现一个getRoutePath函数,接收路由类型(如user、auth)和对应routes属性的键作为参数,返回完整路由路径。当前函数已能正确推断参数类型,但内部访问ROUTES[type].routes[name].path时,TypeScript报错提示类型R无法索引联合类型。尝试用强类型替代satisfies会丢失参数推断,使用makeRoute函数也未能解决问题。

可行解决方案

方案1:添加精准类型断言

通过类型断言明确当前路由组的具体类型,让TypeScript能正确索引:

function getRoutePath<T extends keyof typeof ROUTES, R extends keyof typeof ROUTES[T]['routes']>(
  type: T,
  name: R
) {
  const routeGroup = ROUTES[type];
  // 断言routes为当前类型对应的路由集合
  const targetRoute = (routeGroup.routes as typeof ROUTES[T]['routes'])[name];
  return `${routeGroup.path}/${targetRoute.path}`;
}

方案2:利用分布式条件类型重构关联类型

提前定义路由类型与路由名称的关联关系,让类型推断更精准:

// 提取所有路由组类型
type AllRouteGroups = typeof ROUTES;
// 定义路由类型的联合类型
type RouteType = keyof AllRouteGroups;
// 定义路由类型对应的路由名称类型
type RouteName<T extends RouteType> = keyof AllRouteGroups[T]['routes'];

function getRoutePath<T extends RouteType>(type: T, name: RouteName<T>) {
  const group = AllRouteGroups[type];
  return `${group.path}/${group.routes[name].path}`;
}

方案3:自定义类型守卫做类型收窄

通过类型守卫函数明确当前路由组的类型,消除联合类型的歧义:

type RouteType = keyof typeof ROUTES;
type RouteGroup = typeof ROUTES[RouteType];

function isTargetRouteGroup<T extends RouteType>(
  type: T,
  group: RouteGroup
): group is typeof ROUTES[T] {
  return group.path === ROUTES[type].path;
}

function getRoutePath<T extends RouteType>(type: T, name: keyof typeof ROUTES[T]['routes']) {
  const group = ROUTES[type];
  if (isTargetRouteGroup(type, group)) {
    return `${group.path}/${group.routes[name].path}`;
  }
  throw new Error(`Invalid route type: ${type}`);
}

内容的提问来源于stack exchange,提问作者Riderodd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 22:17:40