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

如何确定泛型函数的返回类型?基于参数推导联合类型成员

可行,用条件类型即可实现

你可以通过条件类型从联合类型C中筛选出与typename参数匹配的具体类型,完全不需要直接引用A或B。

具体实现

首先定义一个工具类型,用来从C中提取对应typename的类型:

type ExtractByTypename<TN extends C["typename"]> = C extends { typename: TN } ? C : never;

然后修改函数的返回类型为这个工具类型,返回时做类型断言即可:

type A = { typename: "A" };
type B = { typename: "B"; message: string };

type C = A | B;

type ExtractByTypename<TN extends C["typename"]> = C extends { typename: TN } ? C : never;

const fn = <TTypeName extends C["typename"]>(
  data: C,
  typename: TTypeName
): ExtractByTypename<TTypeName> => {
  return data as ExtractByTypename<TTypeName>;
};

// 测试验证
const resultB = fn({} as C, "B"); // 类型自动推导为B
const resultA = fn({} as C, "A"); // 类型自动推导为A

进阶优化(可选)

如果需要确保传入的data和typename是匹配的(比如不能传入A类型的data却指定"B"作为typename),可以调整泛型约束:

const fn = <TData extends C, TTypeName extends TData["typename"]>(
  data: TData,
  typename: TTypeName
): ExtractByTypename<TTypeName> => {
  return data as ExtractByTypename<TTypeName>;
};

// 此时如果传入不匹配的参数会报错:
// fn({ typename: "A" } as A, "B"); // 类型错误,因为TTypeName必须是TData的typename

内容的提问来源于stack exchange,提问作者R.M. Reza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 15:15:09