我试图创建一个函数实用程序,在这里我可以传递一个数组作为函数的参数,其中每个成员都是具有以下结构的数组:
[ 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]]}],
) {}
这将强制您只能提供第二个元素为所提供函数的参数类型的元组。
游乐场