TypeScript缺失高阶类型导致ts(2345)错误的可行workaround有哪些?
可行的解决方案
方案1:手动指定泛型参数
这是成本最低的临时解决方案,既然TS无法自动推断泛型identity的参数类型,直接显式声明即可:
const fi1 = F<number, number>(identity).compose(F2); // 此时fi1的类型正确推导为 F<number, string>
方案2:扩展compose方法的类型兼容逻辑
修改F类型的compose签名,使其支持接收已经被F包装过的函数作为参数,自动适配类型:
type UnpackF<T> = T extends F<infer I, infer O> ? [I, O] : T extends (a: infer I) => infer O ? [I, O] : never; type F<T, U> = { (a: T): U; "compose": <G extends (b: U) => any>(g: G) => F<T, ReturnType<G>>; };
调整后只要入参函数的输入类型匹配U就能通过校验,不用区分是原生函数还是F包装后的函数。
方案3:调整调用顺序避开泛型前置
如果业务逻辑允许调整组合顺序,尽量把带明确输入输出类型的函数放在链式调用的头部,泛型函数放在后续的compose参数中,就能触发TS的自动类型推断:
// 原逻辑是identity -> f2,调整为直接用f2的包装实例调用compose传入identity,效果完全一致 const fi1 = F2.compose(identity); // 自动推导类型为 F<number, string>,无报错
注意:如果函数组合的顺序不可调换,优先选择方案1或方案2。
内容的提问来源于stack exchange,提问作者Functor
相关产品推荐
相关产品推荐

