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

TypeScript泛型可选函数参数的返回类型适配问题

解决TypeScript工厂函数可选参数的返回类型匹配问题

要实现让sk成为可选参数,且返回类型根据是否传入sk动态变化,可以通过两种方式实现:

方案一:函数重载(推荐,可读性更强)

通过定义重载签名明确不同调用场景的类型映射:

// 重载签名1:仅传入pk参数
function index<PK extends string>(pk: PK): { pk: PK };
// 重载签名2:同时传入pk和sk参数
function index<PK extends string, SK extends string>(pk: PK, sk: SK): { pk: PK, sk: SK };

// 函数实现逻辑
function index<PK extends string, SK extends string | undefined>(pk: PK, sk?: SK) {
  return sk !== undefined ? { pk, sk } : { pk };
}

// 测试验证
const i1 = index("pk1"); // 类型推导为 { pk: "pk1" }
const i2 = index("pk1", "sk1"); // 类型推导为 { pk: "pk1", sk: "sk1" }

原理说明

  • 重载签名直接对应两种调用场景,让TypeScript能精准推导返回类型;
  • 实现签名兼容sk可选的情况,内部通过判断参数是否存在返回对应结构。

方案二:泛型条件类型(单函数实现)

利用默认泛型参数和条件类型动态判断返回类型:

const index = <PK extends string, SK extends string | undefined = undefined>(
  pk: PK,
  sk?: SK
): SK extends undefined ? { pk: PK } : { pk: PK, sk: SK } => {
  return (sk !== undefined ? { pk, sk } : { pk }) as any;
};

// 测试验证
const i1 = index("pk1"); // 类型为 { pk: "pk1" }
const i2 = index("pk1", "sk1"); // 类型为 { pk: "pk1", sk: "sk1" }

原理说明

  • 通过默认泛型参数SK = undefined处理未传sk的情况;
  • 条件类型SK extends undefined ? ... : ...根据参数是否存在返回对应类型;
  • 需用as any做类型断言,因为TypeScript无法自动推导条件类型的返回值匹配。

内容的提问来源于stack exchange,提问作者florian norbert bepunkt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 17:05:22