【发布时间】:2021-12-30 19:23:51
【问题描述】:
我的目标是包装一个 API 函数,以便包装器具有与 API 函数相同的参数,然后还有一个额外的最终参数。 API 函数非常通用,因此包装器需要从这个内部函数中获取类型和参数。
我的理由是我需要使用额外的可选参数来增强 API 功能。对于使用此包装函数的其他开发人员来说,将此可选参数作为第一个参数将是一种糟糕的体验。
我目前的尝试如下:
const insideFunc = (a: string): string => {
return a
}
const wrapperFunc = <F extends (...args: any[]) => any>(
fn: F
): ((b?: string, ...args: Parameters<F>) => [ReturnType<F>, string]) => {
return (b?: string, ...args: Parameters<F>):[ReturnType<F>, string] => {
return [fn(...args), b]
}
}
这几乎是我需要的,但问题是参数 b 必须在 内部函数的参数之前。
在平行宇宙中,解决方案将在新参数之前包含其余参数,如下所示:
const insideFunc = (a: string): string => {
return a
}
const wrapperFunc = <F extends (...args: any[]) => any>(
fn: F
): ((...args: Parameters<F>, b?: string) => [ReturnType<F>, string]) => {
return (...args: Parameters<F>, b?: string):[ReturnType<F>, string] => { //Observe the difference in argument order.
return [fn(...args), b]
}
}
但是,由于其余参数必须是最终参数,因此出现此错误。
有没有其他方法可以解决这个问题,以便内部函数参数可以在列表中排在第一位?
【问题讨论】:
标签: javascript typescript wrapper