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

TypeScript中函数参数能否使用嵌套泛型?代码报错求解

问题解决:实现正确类型推导的compose函数

你遇到的错误「Type 'F' is not generic」是因为把泛型函数类型当成了泛型类型来使用——F是一个泛型函数的类型,而非泛型类型(比如Array<T>这种),不能用F<A>的语法去实例化它。

你的需求完全可以实现,下面是两种可行的写法:

写法一:直接推导参数与返回类型

这种写法最简洁,TypeScript会自动根据传入的fn和val推导类型:

function compose<A, R>(fn: (val: A) => R, val: A): R {
    return fn(val);
}

// 测试代码
interface FooReturn<T> {
    foo: T
}
function foo<T>(val: T): FooReturn<T> {
    return { foo: val };
}

interface BarReturn<T> {
    bar: T
}
function bar<T>(val: T): BarReturn<T> {
    return { bar: val };
}

let fooRes = compose(foo, ''); // 类型为 FooReturn<string>
let barRes = compose(bar, 1);  // 类型为 BarReturn<number>

写法二:用条件类型捕获泛型函数返回类型(更灵活)

如果需要明确约束fn是泛型函数,可以用infer提取其返回类型:

type GenericFn = <T>(val: T) => any;
type ReturnTypeFor<T, F extends GenericFn> = F extends (val: T) => infer R ? R : never;

function compose<T, F extends GenericFn>(fn: F, val: T): ReturnTypeFor<T, F> {
    return fn(val) as ReturnTypeFor<T, F>;
}

// 测试代码同上,结果一致

两种写法都能让fooRes和barRes获得你期望的类型推导结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 19:08:21