我想创建一个接受另一个函数和该函数的参数的函数。这是一个示例:
function foo(inputFunc: (...args: any[]) => void, ...args: Parameters<typeof inputFunc>) { ... }
function bar(a: string, b: string) { ... }
foo(bar, "string A") //I want this to show an error in the IDE because argument B is missing.
我已经尝试过了:
function foo(inputFunc: (...args: any[]) => void, ...args: Parameters<typeof inputFunc>) { ... }
但是args
的类型始终为any[]
,因为inputFunc的类型为(...args: any[]) => void
。是否有任何方法可以更改...args
中foo
的类型,使其取决于inputFunc
的参数?
编辑
当然,在发布之后,我就找到了自己的问题的答案:
function foo<F extends (...args: any[]) => void>(inputFunc: F, ...args: Parameters<typeof inputFunc>) { ... }
function bar(a: string, b: string) { ... }
foo(bar, "string A") //Throws an error.
答案 0 :(得分:1)
使用泛型来键入传递的函数,以便Parameters
可以使用它:
function foo<T extends (...args: any) => void)>(inputFunc: T, ...args: Parameters<T>) {
}
foo(bar, "string A") // Error
foo(bar, "string A", "string A") // OK
foo(bar, "string A", "string A", "string C") // Error