函数柯里化可将多参函数转为单参函数链,用于URL动态拼接时能预设路由前缀(如/api/v2)、提升复用性;支持动态子前缀、与fetch封装结合及TypeScript类型增强。

函数柯里化可以将一个接收多个参数的函数,转化为一系列只接收单个参数的函数。在 URL 动态参数拼接场景中,用它预设路由前缀(如 /api/v2 或 /user),能提升复用性、减少重复拼接逻辑,同时保持接口清晰。
用柯里化封装基础 URL 构建器
核心思路是:把固定前缀作为第一个参数传入,返回一个新函数,该函数接收路径片段和可选查询参数,自动拼接成完整 URL。
示例实现:
const createUrl = (base) => (path, params = {}) => {
// 基础路径处理:去重斜杠、补前导/
const cleanPath = path.replace(/^\/+|\/+$/g, '');
const fullPath = base.replace(/\/+$/, '') + '/' + cleanPath;
// 查询参数拼接
const query = new URLSearchParams(params).toString();
return query ? `${fullPath}?${query}` : fullPath;
};
// 预设前缀
const apiV2 = createUrl('/api/v2');
const userApi = createUrl('/user');
console.log(apiV2('users')); // "/api/v2/users"
console.log(apiV2('posts', { limit: 10 })); // "/api/v2/posts?limit=10"
console.log(userApi('123/profile')); // "/user/123/profile"
支持动态子前缀(如租户 ID、环境标识)
若前缀本身含变量(例如 /t/{tenantId}),可再柯里化一层:
示例:
const createTenantUrl = (tenantId) =>
createUrl(`/t/${tenantId}/app`);
const tenantApi = createTenantUrl('acme');
console.log(tenantApi('dashboard')); // "/t/acme/app/dashboard"
console.log(tenantApi('settings', { dark: true })); // "/t/acme/app/settings?dark=true"
与 Fetch 封装结合,直接发起请求
进一步把柯里化 URL 构建器和请求逻辑组合,形成高阶 API 函数:
示例:
const createApiClient = (base) => ({
get: (path, params = {}) => fetch(createUrl(base)(path, params)),
post: (path, body) => fetch(createUrl(base)(path), {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(body)
})
});
const api = createApiClient('/api/v2');
api.get('users', { page: 1 }).then(r => r.json());
api.post('orders', { items: ['a', 'b'] });
注意事项与实用技巧
- 路径拼接时统一处理首尾斜杠,避免出现
//或缺失分隔符 - 推荐用
URLSearchParams处理查询参数,自动编码,兼容中文和特殊字符 - 如需兼容旧浏览器,可用轻量 polyfill 或手动编码(
encodeURIComponent) - 柯里化后函数可轻松配合 React 的
useMemo缓存,避免重复创建 - 搭配 TypeScript 可为每个预设前缀标注类型(如
type UserUrl = ReturnType),增强提示
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











