如何用函数柯里化实现通用的类型判断工具函数

张开发
2026/4/16 19:31:56 15 分钟阅读

分享文章

如何用函数柯里化实现通用的类型判断工具函数
柯里化函数需通过闭包保存参数并动态判断是否满足fn.length支持多层调用类型判断应基于Object.prototype.toString.call并封装为可扩展的柯里化谓词函数。curry 函数怎么写才支持多层嵌套调用柯里化不是简单地把参数拆开关键在「返回新函数时要能判断是否已收集够参数」。常见错误是硬编码参数个数导致 isString() 和 isString(abc) 都得走同一套逻辑结果后者直接返回 boolean前者却返回函数调用链就断了。实操建议用闭包保存已传参数每次调用都检查 arguments.length fn.length注意箭头函数没 length得用普通函数不要用 rest 参数重写原函数签名否则 fn.length 变成 0判断失效若目标函数有默认参数fn.length 不包含它们这点容易被忽略示例function curry(fn) { return function curried(...args) { if (args.length fn.length) return fn(...args); return (...more) curried(...args, ...more); }; }type-checking 工具函数为什么要先 curry 再封装 isXxx不柯里化的 isString(val) 每次都要传完整参数没法复用而柯里化后isString 本身是函数可直接用于 array.filter(isString) 或 map(isNumber)这才是通用性的来源。实操建议把类型判断逻辑抽成纯函数如 function isString(x) { return typeof x string; }用上面的 curry 包一层得到 const isString curry(function(x) { return typeof x string; });这样 isString(a) 返回 trueisString 单独用就是谓词函数无需额外包装常见错误有人写 const isString () x typeof x string看似柯里化但丢失了「可直接执行」的能力——isString(a) 会报错因为第一层没参数可接。为什么 Object.prototype.toString.call 比 typeof 更可靠typeof null 返回 objecttypeof [] 也是 object根本分不清数组、正则、日期。而 Object.prototype.toString.call(x) 能返回 [object Array] 这类标准字符串才是类型判断的底层依据。 Trenz AI驱动的社交电商营销平台专为TikTok Shop设计

更多文章