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

如何实现接收泛型函数参数并获取其特定类型调用的返回类型?

解决方案

你可以通过条件类型结合泛型推断实现这个需求,核心是提取泛型函数的输入输出逻辑,将输入类型固定为目标类型{ bar: string }后,得到对应的输出类型。

实现代码

type Foo<Transformer extends <X>(x: X) => any> = 
  Transformer extends <X>(x: X) => infer Output 
    ? X extends { bar: string } ? Output : never 
    : never;

使用示例

type X = Foo<<X>(val: X) => X & { foo: string }>;
// X 的类型为 { bar: string } & { foo: string },符合预期

错误原因解释

你之前的代码报错Type 'Transformer' is not generic,是因为Transformer是泛型函数类型,而非泛型类型。TypeScript 不允许像调用泛型类型(如Array<number>)那样直接给泛型函数类型传入类型参数(如Transformer<{bar:string}>)。泛型函数的泛型参数是在函数调用时确定的,不能作为类型的参数直接使用。

另一种更直观的写法

如果你希望逻辑更清晰,可以拆分出通用的「应用转换器」类型,再基于它实现Foo:

// 通用工具:将转换器应用到指定输入类型
type ApplyTransformer<F extends <X>(x: X) => any, Input> = 
  F extends <X>(x: X) => infer Output 
    ? X extends Input ? Output : never 
    : never;

// 基于通用工具实现 Foo,固定输入为 { bar: string }
type Foo<Transformer> = ApplyTransformer<Transformer, { bar: string }>;

使用方式和之前一致,同样能得到预期结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 03:35:08