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),仅供参考

相关新闻

Unity照片墙实现:可交互、可扩展的UI陈列系统

Unity照片墙实现:可交互、可扩展的UI陈列系统

简介:本资源是一份面向Unity初学者与中级开发者的照片墙效果实战项目,聚焦于UI视觉展示与基础交互实现,适用于数字展厅、作品集展示、教育类应用等轻量级3D场景。项目包含310个文件,以80张PNG图片素材为核心资源,辅以2…

2026/11/9 20:48:11 阅读更多 →
WTF-Solidity 工具链核心:forge-std 标准库实战指南(stdError / stdStorage / stdCheats / console)

WTF-Solidity 工具链核心:forge-std 标准库实战指南(stdError / stdStorage / stdCheats / console)

WTF-Solidity 工具链核心:forge-std 标准库实战指南(stdError / stdStorage / stdCheats / console) 【免费下载链接】WTF-Solidity WTF Solidity 极简入门教程,供小白们使用。Now supports English! 官网: https://wtf.academy …

2026/11/9 13:10:14 阅读更多 →
2026年3款降AI率软件实测对比,降AI率下不来必看

2026年3款降AI率软件实测对比,降AI率下不来必看

最近在学术圈经常听到这样的抱怨:明明是自己写的论文,AIGC检测却显示80%以上AI生成;查重率怎么也降不到学校要求的15%以下;盲审前夕熬夜改到词穷,却越改越乱。如果你也面临这样的困境,别着急,本…

2026/11/9 14:35:34 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/9 14:01:10 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/9 14:56:39 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/9 1:59:56 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/9 14:01:10 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/9 7:45:06 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/9 14:01:11 阅读更多 →

日新闻

周新闻

月新闻