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
相关产品推荐
相关产品推荐

