TS为数组的每个函数成员推断形参



我试图创建一个函数实用程序,在这里我可以传递一个数组作为函数的参数,其中每个成员都是具有以下结构的数组:

[ function, functionParams ]

基本上,这个帮助器将一些缺失的信息添加到每个函数共有的函数参数中;其中一个例子是令牌值(这些函数进行HTTP调用);因此,实际上,提供给该函数的数组值的成员是这样的:

[ Function, Omit<FunctionParams, CommonValues>]

我使用这个函数的方式是通过为这个辅助函数提供一个数组,它调用"并行"的所有内容。(使用Redux-Sagaall)

我尝试了很多方法都没有成功;到目前为止,我最好的方法是这样的:

interface MyTypeFunction<T extends object = {}> {
( params: T & CommonProps ): any
}
function utilityHelper <T extends object> (
param: [ MyTypeFunction<T>, T ][],
) {
...
}

问题是,由于类型参数(T)是为整个函数定义的,当我用具有不同参数签名的函数调用它时,TS会出错,因为它期望所有这些函数都具有相同的签名,最有可能的是,数组的第一个元素的签名(尽管有时看起来像TS在使每个成员的参数相交,所以是的,我不太确定到底发生了什么)。下面是使用它的一个例子:

const functionA: MyTypeFunction<{ name: string}> = param => {};
const functionB: MyTypeFunction<{ id: number }> = param => {};
utilityHelper( [
[ functionA, { name: 'Name' } ],
[ functionB, { id: 358 } ],
] );

这将导致函数b出错,表示{id: number}不能赋值给类型{name: string}

我想做的事情真的可以完成吗?

您可能想要这样的内容:

function utilityHelper <T extends any[]> (
param: [...{[K in keyof T]: [MyTypeFunction<T[K]>, T[K]]}],
) {}

这将强制您只能提供第二个元素为所提供函数的参数类型的元组。

游乐场

最新更新