如何确定泛型函数的返回类型?基于参数推导联合类型成员
可行,用条件类型即可实现
你可以通过条件类型从联合类型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
相关产品推荐
相关产品推荐

