展开Parameters<F>时触发TypeScript错误,其原因是什么?
为什么会出现这个TypeScript错误?
这个错误的核心原因是你对泛型函数F的约束太宽泛,导致TypeScript无法确定Parameters<F>是可展开的元组类型。
你写的约束是F extends (...args: any) => any,这里的any表示单个参数的类型为any,而非“接受任意参数列表”。TypeScript看到这个约束时,会认为F可能是一个只接受单个非数组类型参数的函数,对应的Parameters<F>就可能被判定为无法被...展开的类型(虽然实际上Parameters<F>总是元组,但在泛型上下文里TypeScript没法提前确定这一点)。
解决方法很简单,把泛型约束改成F extends (...args: any[]) => any,明确F是接受任意数组形式参数列表的函数:
function wrapMe<F extends (...args: any[]) => any>( f: F, ): (...args: Parameters<F>) => ReturnType<F> { return function(...args: Parameters<F>): ReturnType<F> { return f(...args); // 现在不会报错了 } }
你也可以直接利用TypeScript的类型推断,简化返回值类型的写法,让代码更简洁:
function wrapMe<F extends (...args: any[]) => any>(f: F) { return function(...args: Parameters<F>): ReturnType<F> { return f(...args); } }
内容的提问来源于stack exchange,提问作者joegomain
相关产品推荐
相关产品推荐

