0

0

重构路由对象键路径为完整 URL 路径的 TypeScript 工具函数

花韻仙語

花韻仙語

发布时间:2026-03-16 22:34:02

|

200人浏览过

|

来源于php中文网

原创

重构路由对象键路径为完整 URL 路径的 TypeScript 工具函数

本文提供一个类型安全、简洁健壮的 TypeScript 函数,用于根据嵌套路由对象和点分隔的键路径字符串(如 "r.ACCOUNT.ADDRESSES.DETAIL"),动态拼接出完整的 URL 路径(如 "start/account/addresses/:addressId")。

本文提供一个类型安全、简洁健壮的 typescript 函数,用于根据嵌套路由对象和点分隔的键路径字符串(如 `"r.account.addresses.detail"`),动态拼接出完整的 url 路径(如 `"start/account/addresses/:addressid"`)。

在现代前端路由系统中,常将路由结构建模为嵌套 JavaScript 对象,其中每个节点通过 HOME 键定义其基础路径片段,子节点则以命名属性形式组织(如 PROFILE、DETAIL)。这种设计兼顾可读性与层级表达力,但需配套工具函数将“路径字符串”映射为真实 URL。下面是一个生产就绪的解决方案。

✅ 核心思路

  • 将输入路径(如 "r.ACCOUNT.ADDRESSES.DETAIL")按 . 分割,校验首段必须为 "r";
  • 逐级遍历对象树:每进入一个子节点前,先追加当前层级的 HOME 值 + /;
  • 到达末级时,若该值为字符串(叶子节点),直接使用;若仍为对象(如误传到中间节点但未指定具体子键),则回退取其 HOME —— 这保证了 r.INVENTORY.CATEGORIES 正确返回 .../categories,而非报错。

? TypeScript 实现(含完整类型定义)

type RouteNode = string | { HOME: string; [key: string]: RouteNode | string };

function buildRoute(node: RouteNode, path: string): string {
  const keys = path.split(".");
  if (keys[0] !== "r") {
    throw new Error("Path must start with 'r.'");
  }

  let result = "";
  let current: RouteNode = node;

  // 遍历 r 后的所有键(如 ACCOUNT → ADDRESSES → DETAIL)
  for (const key of keys.slice(1)) {
    if (typeof current !== "object" || current === null || !(key in current)) {
      throw new Error(`Invalid path: key '${key}' not found in current route node`);
    }
    // 断言 current 为对象(因已通过 in 检查且非 string)
    const obj = current as Record<string, RouteNode>;
    result += obj.HOME + "/";
    current = obj[key];
  }

  // 末级处理:若 current 是字符串,直接用;否则取其 HOME(兼容如 r.INVENTORY.CATEGORIES)
  return result + (typeof current === "string" ? current : (current as { HOME: string }).HOME);
}

? 使用示例

const r = {
  HOME: "start",
  ACCOUNT: {
    HOME: "account",
    PROFILE: "profile",
    ADDRESSES: {
      HOME: "addresses",
      DETAIL: ":addressId",
    },
  },
  ESHOP: {
    HOME: "eshop",
    INVOICES: "invoices",
    ORDERS: {
      HOME: "orders",
      DETAIL: ":orderId",
    },
  },
  INVENTORY: {
    HOME: "warehouse", // 注意:原答案中写为 "inventory",此处按问题描述统一为 "warehouse"
    CATEGORIES: {
      HOME: "categories",
      CATEGORY: {
        HOME: ":categoryId",
        PRODUCTS: {
          HOME: "products",
          PRODUCT: ":productId",
        },
      },
    },
  },
};

console.log(buildRoute(r, "r.ACCOUNT.ADDRESSES.DETAIL"));
// → "start/account/addresses/:addressId"

console.log(buildRoute(r, "r.INVENTORY.CATEGORIES"));
// → "start/warehouse/categories"

console.log(buildRoute(r, "r.INVENTORY.CATEGORIES.CATEGORY.PRODUCTS.PRODUCT"));
// → "start/warehouse/categories/:categoryId/products/:productId"

⚠️ 注意事项与最佳实践

  • 路径格式强约束:函数假设输入始终以 "r." 开头,不支持别名或动态根名;如需扩展,可将根标识符作为参数传入。
  • 类型安全提示:RouteNode 类型采用联合类型,准确覆盖“纯路径字符串”与“含 HOME 的子路由对象”两种形态;TypeScript 编译器可据此推导路径合法性。
  • 错误防御:对缺失键、非法类型提前抛出语义化错误,便于调试;生产环境可结合 try/catch 做优雅降级。
  • 性能考量:时间复杂度为 O(n),n 为路径深度,无递归调用,避免栈溢出风险,适合高频调用场景(如路由生成、链接预加载)。

该函数轻量(<20 行核心逻辑)、零依赖、开箱即用,是构建声明式路由系统的理想基础设施组件。

快写红薯通AI
快写红薯通AI

快写红薯通AI,专为小红书而生的AI写作工具

下载

相关文章

路由优化大师
路由优化大师

路由优化大师是一款及简单的路由器设置管理软件,其主要功能是一键设置优化路由、屏广告、防蹭网、路由器全面检测及高级设置等,有需要的小伙伴快来保存下载体验吧!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

50

2026.02.13

TypeScript全栈项目架构与接口规范设计
TypeScript全栈项目架构与接口规范设计

本专题面向全栈开发者,系统讲解基于 TypeScript 构建前后端统一技术栈的工程化实践。内容涵盖项目分层设计、接口协议规范、类型共享机制、错误码体系设计、接口自动化生成与文档维护方案。通过完整项目示例,帮助开发者构建结构清晰、类型安全、易维护的现代全栈应用架构。

199

2026.02.25

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

114

2026.03.13

mysql标识符无效错误怎么解决
mysql标识符无效错误怎么解决

mysql标识符无效错误的解决办法:1、检查标识符是否被其他表或数据库使用;2、检查标识符是否包含特殊字符;3、使用引号包裹标识符;4、使用反引号包裹标识符;5、检查MySQL的配置文件等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

217

2023.12.04

Python标识符有哪些
Python标识符有哪些

Python标识符有变量标识符、函数标识符、类标识符、模块标识符、下划线开头的标识符、双下划线开头、双下划线结尾的标识符、整型标识符、浮点型标识符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

326

2024.02.23

java标识符合集
java标识符合集

本专题整合了java标识符相关内容,想了解更多详细内容,请阅读下面的文章。

294

2025.06.11

c++标识符介绍
c++标识符介绍

本专题整合了c++标识符相关内容,阅读专题下面的文章了解更多详细内容。

179

2025.08.07

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

761

2023.08.03

chatgpt使用指南
chatgpt使用指南

本专题整合了chatgpt使用教程、新手使用说明等等相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.03.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
TypeScript 教程
TypeScript 教程

共19课时 | 3.5万人学习

TypeScript——十天技能课堂
TypeScript——十天技能课堂

共21课时 | 1.2万人学习

TypeScript-45分钟入门
TypeScript-45分钟入门

共6课时 | 0.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号