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

如何实现返回类型依赖泛型参数的TypeScript函数类型推断?

泛型函数返回类型依赖泛型参数的类型推断解决方案

你遇到的问题是TypeScript无法自动将cond ? "a" : "b"的联合类型收窄到条件类型Cond extends true ? "a" : "b",导致添加返回类型标注后函数体报错,但外部类型推断结果正确。以下是几种最佳解决方法:

方法一:类型断言

直接在返回值处添加类型断言,明确告知TypeScript返回值符合定义的条件类型:

const foo = <Cond extends boolean>(
  cond: Cond,
): Cond extends true ? "a" : "b" => {
  return (cond ? "a" : "b") as Cond extends true ? "a" : "b";
};

type a = ReturnType<typeof foo<true>>; // "a"
type b = ReturnType<typeof foo<false>>; // "b"

这种方式简单直接,适合逻辑简单的场景,不会改变函数的外部类型表现。

方法二:函数重载

通过定义函数重载签名,明确指定不同泛型参数对应的返回类型,实现更清晰的类型约束:

// 重载签名
function foo(cond: true): "a";
function foo(cond: false): "b";

// 实现签名
function foo(cond: boolean) {
  return cond ? "a" : "b";
}

type a = ReturnType<typeof foo<true>>; // "a"
type b = ReturnType<typeof foo<false>>; // "b"

重载方式更直观,TypeScript能完美匹配不同输入对应的返回类型,函数体也不会出现类型错误,适合需要明确区分不同输入分支的场景。

方法三:收紧泛型约束

将泛型约束从boolean改为true | false,让TypeScript更精确地识别分支类型,配合局部断言消除报错:

const foo = <Cond extends true | false>(cond: Cond): Cond extends true ? "a" : "b" => {
  return cond ? "a" : "b" as typeof cond extends true ? "a" : "b";
};

这种方式保留了箭头函数的写法,同时通过更精确的泛型约束提升类型推断的准确性。

内容的提问来源于stack exchange,提问作者Magnar Myrtveit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 04:42:39