如何实现接收泛型函数参数并获取其特定类型调用的返回类型?
解决方案
你可以通过条件类型结合泛型推断实现这个需求,核心是提取泛型函数的输入输出逻辑,将输入类型固定为目标类型{ 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
相关产品推荐
相关产品推荐

