使用Lodash的curry结合bind触发TypeScript类型错误求助
解决Lodash Curry结合Bind时的TypeScript类型错误
我之前也踩过这个坑!本质是TypeScript对原生bind和Lodashcurry的类型推断逻辑没兼容好,导致类型检查报错。咱们一步步拆解问题和解决方案:
问题根源
当你用bind预设getSomething的第一个参数后,TypeScript会把这个绑定后的函数推断为可选剩余参数的类型(比如(b?: number) => string)。而Lodash的curry在处理这种带有可选参数的函数时,无法正确识别原函数的参数数量,最终导致调用时出现「预期0-1个参数但传入了2个」的类型错误。
解决方案
方案1:用Curry本身的特性替代Bind(推荐)
Lodash的curry本身就支持提前传入参数来固定部分值,完全不需要bind,类型推断也会完美适配:
import _ from 'lodash'; function getSomething(a: string, b: number): string { return `${a}-${b}`; } // 先创建curried版本 const curriedGet = _.curry(getSomething); // 固定第一个参数,得到只需要传第二个参数的函数 const fixedFirstArg = curriedGet('fixed-value'); // 调用时类型完全正常 fixedFirstArg(123); // 返回 "fixed-value-123"
方案2:显式指定Curry的泛型参数
如果你一定要用bind,可以手动给curry指定泛型,强制它按照原函数的参数类型来处理:
const curriedGet = _.curry<(a: string, b: number) => string>( getSomething.bind(null, 'fixed-value') ); // 此时调用curriedGet(123)或者curriedGet('another', 456)都不会报错
方案3:用类型断言修正Bind后的函数类型
把bind返回的函数断言为明确的剩余参数类型,让TypeScript和Lodash的类型系统对齐:
// 断言bind后的函数只接受一个number参数 const boundGet = getSomething.bind(null, 'fixed-value') as (b: number) => string; const curriedGet = _.curry(boundGet); // 调用时类型检查正常 curriedGet(123);
总结
优先用方案1,这是Lodashcurry的设计初衷,代码更简洁也不会有类型问题。如果因为某些场景必须用bind,方案2或3都能解决类型报错的问题。
内容的提问来源于stack exchange,提问作者undefined
相关产品推荐
相关产品推荐

