如何让TypeScript的funcCb自动推导回调参数对应的返回类型?
问题解决:让
funcCb自动推导布尔分支的返回类型 原代码中funcCb的返回类型被合并为联合类型,核心原因是回调参数isTrue被推断为boolean,导致TypeScript无法区分传入true/false时的具体返回值类型。以下是无需类型断言的解决方案,同时适配funcOne、funcTwo这类布尔分支函数:
改写后的完整代码
function funcOne<T extends boolean = false>(isTrue: T) { type RETURN = T extends true ? string : number; return (isTrue ? "Cool" : 10) as RETURN; } // 优化后的funcCb function funcCb<TrueRet, FalseRet>( cb: <T extends boolean>(isTrue: T) => T extends true ? TrueRet : FalseRet ) { return { getFirst: () => cb(true), getSecond: () => cb(false) }; } // 测试funcOne const result = funcCb((isTrueInCb) => { return funcOne(isTrueInCb); }); // result类型自动推导为:{ getFirst: () => string; getSecond: () => number; } // 测试funcTwo function funcTwo<T extends boolean = false>(isTrue: T) { type RETURN = T extends true ? Date : string; return (isTrue ? new Date() : new Date().toString()) as RETURN; } const resultTwo = funcCb((isTrueInCb) => { return funcTwo(isTrueInCb); }); // resultTwo类型自动推导为:{ getFirst: () => Date; getSecond: () => string; }
核心原理
- 泛型参数捕获分支类型:
funcCb通过TrueRet和FalseRet两个泛型参数,分别绑定回调在传入true和false时的返回类型。 - 泛型回调触发类型推导:要求回调是
<T extends boolean>的泛型函数,TypeScript会根据funcOne/funcTwo内部的条件类型,自动推导TrueRet和FalseRet的具体值。 - 精准匹配分支调用:调用
cb(true)时,TypeScript会将泛型T锁定为true,返回TrueRet类型;调用cb(false)则锁定为false,返回FalseRet类型,全程无需手动断言。
内容的提问来源于stack exchange,提问作者Vishal Mishra
相关产品推荐
相关产品推荐

