You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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; }

核心原理

  1. 泛型参数捕获分支类型:funcCb通过TrueRet和FalseRet两个泛型参数,分别绑定回调在传入true和false时的返回类型。
  2. 泛型回调触发类型推导:要求回调是<T extends boolean>的泛型函数,TypeScript会根据funcOne/funcTwo内部的条件类型,自动推导TrueRet和FalseRet的具体值。
  3. 精准匹配分支调用:调用cb(true)时,TypeScript会将泛型T锁定为true,返回TrueRet类型;调用cb(false)则锁定为false,返回FalseRet类型,全程无需手动断言。

内容的提问来源于stack exchange,提问作者Vishal Mishra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 13:40:33