TypeScript将三元泛型函数改写为柯里化版本时的类型报错问题
问题根源
TypeScript的泛型参数推导是跟随函数调用时机逐次完成的,你当前的写法将<I, O, E>三个泛型全部声明在最外层函数上,当你执行第一步调用curriedFunc(e => Error(${e}))时,TypeScript就需要确定所有泛型的具体类型。但第一个入参eFn的类型仅和泛型E相关,完全没有提供I、O的推导依据,TypeScript会默认将I、O推导为unknown类型,后续传入searchById时自然会出现类型不匹配的报错。
解决方案
将泛型参数拆分到实际使用该泛型的函数层即可:E由第一层入参使用,声明在最外层函数;I、O由第二层入参lp使用,声明在第二层函数。
正确代码如下:
import * as TE from 'fp-ts/TaskEither'; const curriedFunc = <E>(eFn: (e: unknown) => E) => <I, O>(lp: (id1: I) => Promise<O | null>) => (id2: I) => TE.tryCatch(() => lp(id2), eFn)
修改后你原有的调用逻辑可以正常通过TypeScript类型校验,泛型会按照预期自动推导:E推导为Error,I推导为string,O推导为User。
内容的提问来源于stack exchange,提问作者Rick
相关产品推荐
相关产品推荐

