新闻详情

新闻详情

首页 / 资讯中心 / 详情

es-toolkit compat 版 partialRight 完全指南:从右侧预填参数,实现函数柯里化的反向技巧

发布时间:2026/9/15 20:11:34来源:尧图网络
es-toolkit compat 版 partialRight 完全指南:从右侧预填参数,实现函数柯里化的反向技巧
es-toolkit compat 版 partialRight 完全指南从右侧预填参数实现函数柯里化的反向技巧【免费下载链接】es-toolkitA modern JavaScript utility library thats 2-3 times faster and up to 97% smaller, a major upgrade to lodash.项目地址: https://gitcode.com/GitHub_Trending/es/es-toolkitpartialRight是 es-toolkit 的 Lodash 兼容包es-toolkit/compat中提供的一个函数式工具它从右侧开始为原函数预填参数生成一个新函数非常适合固定末尾参数、动态变化前置参数的调用场景。本文将带你掌握它的导入方式、占位符用法、与原生版partialRight的取舍并从源码层面剖析其参数替换算法与边界行为帮助你在实际项目中正确、高效地使用它。一、partialRight 是什么与 partial 的镜像关系partialRight(func, ...args)的作用是创建一个偏函数partially applied function从右侧预填参数。它与常见的partial恰好互补partial把预填参数放在调用参数的前面而partialRight把预填参数追加在调用参数的后面因此特别适合参数顺序敏感、末尾参数固定的场景。const partialFunc partialRight(func, ...args);核心思想一句话概括调用新函数时传入的参数占据参数列表的前部预填的参数占据参数列表的后部。二、安装与导入partialRight位于 es-toolkit 的兼容层es-toolkit/compat中。安装 es-toolkit 后通过如下方式引入import { partialRight } from es-toolkit/compat;在 es-toolkit 的仓库结构中兼容层的导出入口定义在 src/compat/compat.ts其中通过export { partialRight } from ./function/partialRight.ts将兼容实现对外暴露。三、基本用法partialRight(func, ...args)当你希望从右侧预填参数时使用partialRight。在参数顺序很重要的场景下它主要用于固定最后的几个参数。import { partialRight } from es-toolkit/compat; // 基本用法 function greet(greeting, name, punctuation) { return ${greeting} ${name}${punctuation}; } // 预填最后一个参数 const greetWithExclamation partialRight(greet, !); greetWithExclamation(Hello, Alice); // Hello Alice! // 预填多个参数 const sayHiToAlice partialRight(greet, Alice, !); sayHiToAlice(Hi); // Hi Alice! // 使用占位符控制参数顺序 const greetAliceWithCustom partialRight(greet, Alice, partialRight.placeholder); greetAliceWithCustom(Hello, ?); // Hello Alice?从上面的第三个例子可以看到当预填参数中出现partialRight.placeholder时调用时传入的参数会按顺序替换掉占位符位置从而实现在中间某个位置动态传入参数。参数Parameters参数类型说明funcFunction要进行部分应用partial apply的原函数...argsany[]从右侧预填的参数使用partialRight.placeholder可以控制参数插入顺序返回值ReturnsFunction返回一个从右侧预填了参数的新函数。新函数被调用时调用方传入的参数会排在前面预填参数排在后面共同构成对原函数的完整调用。四、占位符 partialRight.placeholder占位符是partialRight最灵活也最容易忽略的特性。它的作用是在预填参数列表中挖一个坑等待调用时传入的真实参数来填。import { partialRight } from es-toolkit/compat; // 固定 Alice 与 !但允许调用时动态传入 greeting const greetAliceWithCustom partialRight(greet, Alice, partialRight.placeholder); greetAliceWithCustom(Hello, ?); // Hello Alice?在源码层面占位符被定义为一个唯一的 Symbol 值partialRight.placeholder Symbol(compat.partialRight.placeholder) as Placeholder;这段代码位于 src/compat/function/partialRight.ts。使用 Symbol 作为占位符可以保证只要传入的参数不是这个精确的 Symbol 引用就不会与普通参数发生冲突。需要特别说明的是compat 版的占位符类型被设计为symbol | ((value: any) any) { partialRight: typeof partialRight }即它同时兼容了Toolkit函数对象类型。这是因为在 compat 层中占位符与 es-toolkit 的Toolkit迭代器函数共用类型定义见 src/compat/toolkit.ts这也是导致其类型系统远比原生版复杂的原因之一。五、官方提醒优先使用 es-toolkit 原生 partialRight这是该文档中最重要的一条工程建议值得单独强调警告由于存在大量函数重载overloads与联合类型union type处理compat 版partialRight是低效的inefficient。在绝大多数情况下它都可以被一个更简单的箭头函数替代。请改用 es-toolkit 自带、更快且更现代的partialRight。这句话有两层含义性能层面compat 版为了兼容 Lodash 的行为签名在类型定义上堆砌了数十个重载从无参数到四参数、再到各种占位符组合运行时类型体操的成本更高。代码简洁层面在大多数业务场景下根本不需要引入偏函数工具一个箭头函数即可表达同样的意图// 使用箭头函数替代 partialRight推荐 const greetWithExclamation (greeting, name) greet(greeting, name, !); const sayHiToAlice greeting greet(greeting, Alice, !);这是官方文档明确的推荐做法能用箭头函数表达清楚就不要引入 partialRight 的开销。如果你确实需要偏函数能力优先从es-toolkit/function导入原生版本其使用方式如下完整文档见 docs/reference/function/partialRight.mdimport { partialRight } from es-toolkit/function; function subtract(a: number, b: number, c: number) { return a - b - c; } const subtractFrom10And5 partialRight(subtract, 5, 2); console.log(subtractFrom10And5(10)); // 10 - 5 - 2 3原生版实现位于 src/function/partialRight.ts并通过 src/function/index.ts 对外导出。六、源码级原理partialRightImpl 的占位符替换算法compat 版在运行时实现上并没有另起炉灶而是直接复用了原生版的核心逻辑partialRightImpl。查看 src/compat/function/partialRight.ts 可以看到compat 版只是把占位符换成自己的Symbol(compat.partialRight.placeholder)然后委托给原生实现return partialRightImplF, Placeholder(func, partialRight.placeholder, ...partialArgs);真正的算法位于 src/function/partialRight.ts其核心思路可以拆解为三步统计占位符数量partialArgs.filter(arg arg placeholder).length算出预填参数里有多少个坑。切分调用参数providedArgs.slice(0, rangeLength)其中rangeLength Math.max(providedArgs.length - placeholderLength, 0)。也就是说调用方传入的参数先喂饱所有占位符剩余部分作为前缀参数排在前面。替换占位符遍历预填参数列表遇到占位符就从调用参数中依次取出一个真实值填入非占位符参数保持不变。最终通过func.apply(this, remainingArgs.concat(substitutedArgs))完成对原函数的调用。此外实现还做了两件关键的兼容性工作原型链继承if (func.prototype) { partialedRight.prototype Object.create(func.prototype); }保证生成的新函数可以用new调用且实例仍然instanceof原函数。不设置 length 属性生成的函数length恒为 0注释中明确说明This method doesnt set the length property避免外部代码依赖函数的参数个数。七、测试验证边界行为一览仓库在 src/compat/function/partialRight.spec.ts 中提供了覆盖完善的测试用例可以帮助我们确认上述行为基础偏应用partialRight(identity, a)()返回a对双参数函数partialRight(fn, a)(b)得到[b, a]验证了调用参数在前、预填参数在后的顺序。无预填参数不传预填参数时新函数行为与原函数基本一致。占位符行为partialRight(fn, placeholder, b, placeholder)调用(a, c)得到[a, b, c]调用(a)得到[a, b, undefined]不传参得到[undefined, b, undefined]——这说明占位符没有足够的参数填充时会以undefined兜底。length 为 0partialRight(fn, a).length为0。构造函数兼容new par() instanceof Foo为true证明原型链被正确保留。元数据克隆对 partialRight 的返回值再次 partialRight可以连续叠加预填参数par2()得到barney hi。与 curry 协作curry(partialRight(fn, 1), 2)后既能curried(2, 3)调用也能curried(2)(3)分步调用。实际应用模式partialRight(mergeWith, deep)可构造出深度 defaults 合并函数这展示了 partialRight 在固定回调参数上的典型用途。原生版 src/function/partialRight.spec.ts 中的用例与 compat 版基本对应进一步印证了二者共享同一套运行时实现。八、适用场景与最佳实践小结综合文档、源码与测试使用partialRight时建议遵循以下原则优先箭头函数若只是固定一两个末尾参数直接用箭头函数包裹即可可读性更好、零运行时开销。需要占位符时再考虑 partialRight当需要固定中间或末尾的多个参数、同时保留中间空位动态传入时partialRight.placeholder是唯一优雅的表达方式。优先原生版确定需要偏函数时从es-toolkit/function导入原生partialRight避免 compat 版大量重载带来的类型与性能开销。仅在 Lodash 迁移场景使用 compat 版如果你正在从 Lodash 平滑迁移、且代码中大量使用_.partialRightes-toolkit/compat版可以提供行为一致的替代品降低迁移成本迁移完成后仍建议逐步替换为箭头函数或原生版。注意 length 语义partialRight 返回的函数length为 0不要依赖其形参个数做逻辑判断。通过本文你已掌握 compat 版partialRight的完整用法、占位符机制、与原生版的差异以及其底层参数替换算法的原理——这些足以支撑你在代码中做出正确、高效的决策。【免费下载链接】es-toolkitA modern JavaScript utility library thats 2-3 times faster and up to 97% smaller, a major upgrade to lodash.项目地址: https://gitcode.com/GitHub_Trending/es/es-toolkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

基于Vue3与Three.js的三维油藏模型可视化与交互切割实战 2026/9/15 21:50:59

基于Vue3与Three.js的三维油藏模型可视化与交互切割实战

做油田数字化项目越久越发现,模型好看只是表象,真正要命的是数据。要说三维可视化本身,Three.js的社区案例一抓一大把,但一旦把场景换成油藏模型,很多人立刻就卡住了——模型文件动不动几百MB、网格数据几十万甚至上百…

阅读更多 →
SurfSense 知识库优先(KB-First)落地机制:主 Agent 如何用实时数据接地事实答案 2026/9/15 21:50:59

SurfSense 知识库优先(KB-First)落地机制:主 Agent 如何用实时数据接地事实答案

SurfSense 知识库优先(KB-First)落地机制:主 Agent 如何用实时数据接地事实答案 【免费下载链接】SurfSense Open-source NotebookLM alternative. Research the open web with live data(Reddit, YT, IG, TikTok, Indeed, Google Search, Ma…

阅读更多 →
AI微服务配置中心实战:Nacos动态刷新与部署避坑指南 2026/9/15 21:50:59

AI微服务配置中心实战:Nacos动态刷新与部署避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
PHP微信上墙大屏互动源码解析:从回调接入到部署上线 2026/9/15 21:50:59

PHP微信上墙大屏互动源码解析:从回调接入到部署上线

简介:基于PHP打造的微信上墙大屏幕现场互动源码V7.24,面向活动会议、晚会演出等场景,为PHP开发者与活动运营方提供一套可直接部署的微信互动大屏方案,适合具备一定PHP基础并希望掌握微信开发实战的读者。压缩包内共2000个文件&…

阅读更多 →
Cataclysm-DDA Mind Over Matter 模组:异能觉醒(Awakening)与习得机制完全指南 2026/9/15 21:50:59

Cataclysm-DDA Mind Over Matter 模组:异能觉醒(Awakening)与习得机制完全指南

Cataclysm-DDA Mind Over Matter 模组:异能觉醒(Awakening)与习得机制完全指南 【免费下载链接】Cataclysm-DDA Cataclysm - Dark Days Ahead. A turn-based survival game set in a post-apocalyptic world. 项目地址: https://gitcode.co…

阅读更多 →
k-means++初始化:让KMeans聚类更稳更优的默认选择 2026/9/15 21:47:59

k-means++初始化:让KMeans聚类更稳更优的默认选择

如果你用过sklearn里的KMeans,大概率会注意到一个默认参数:initk-means。大多数教程都会叫你“保持默认,不要动”,但很少说清楚它到底是什么、为什么好用。k-means不是新聚类算法,它只是k-means的一个初始化策略&#…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞