TypeScript泛型函数上下文类型推断失效问题及可行方案问询
问题解答
无法通过修改makeFn的类型定义实现目标,核心原因是TypeScript的上下文类型推断无法跨多层函数调用传递。
对比两种函数的推断逻辑
directFn的正常推断:
directFn直接返回传入的函数。当directFn(x => x + 1)作为参数传给useFn时,useFn的第二个参数1(number类型)会直接反向推导directFn的泛型参数T为number,进而自动推断出x的类型是number,返回值x+1为number。整个推断链条是连续的,上下文类型可以直接传递到最内层的箭头函数。makeFn的推断中断:
makeFn的逻辑是接受函数后返回一个无参函数,再通过调用该无参函数得到原函数。此时makeFn(x => x + 1)是独立的第一步调用,TypeScript处理这一步时没有任何上下文信息能确定x的类型,只能默认推断x为unknown,返回值为any。后续调用()得到的函数类型已经固定,useFn的参数类型无法回溯修改之前已完成的推断结果。
替代方案(需调整结构)
如果要保留类似的逻辑并实现正确推断,只能修改makeFn的调用结构,比如去掉中间的无参函数层,或者让中间函数参与类型传递,但这已经不属于单纯修改类型定义的范畴。
内容的提问来源于stack exchange,提问作者Christoph Franke
相关产品推荐
相关产品推荐

