如何修改createFun使TypeScript正确推断泛型参数T?
问题解决:让泛型参数T正确自动推断
你的问题核心在于:原createFun函数中,泛型参数T同时出现在逆变位置(f的参数id: T)和协变位置(f的返回值T、arg的返回值T),TypeScript的自动推断算法在这种循环依赖场景下,会默认选择最宽松的unknown类型作为推断结果。
要让T能自动从f的调用参数(比如1、"")推断出正确类型,你可以修改createFun的类型定义,让f成为一个泛型函数,约束其参数类型是T的子类型,打破推断的循环依赖:
function createFun<T>(arg: (f: <U extends T>(id: U) => T) => T) { // 函数体逻辑保持不变即可 } // 现在调用会自动推断正确的T类型 const fun1 = createFun((f) => f(1)); // T = number const fun2 = createFun((f) => f("")); // T = string const fun3 = createFun((f) => f(true)); // T = boolean
原理说明:
修改后的f是一个内部泛型函数,接受U extends T类型的参数并返回T。当你调用f(1)时,TypeScript会先推断出U = number,再结合U extends T的约束,自动推导出T的最小可能类型就是number(同理适用于字符串、布尔值)。
而你手动指定T时能正常工作,是因为此时TypeScript不需要进行自动推断,直接验证f的调用是否符合(id:T)=>T的类型规则,自然能正确触发错误或通过校验。
内容的提问来源于stack exchange,提问作者Page not found
相关产品推荐
相关产品推荐

