Typescript 如何使用变量参数强类型函数

Typescript 如何使用变量参数强类型函数,typescript,Typescript,我正在用Typescript编写一个解析器组合器。其中一个函数用于获取另一个具有任何类型签名和一定数量参数的函数,然后调用它: function f(func, ...args) { func.apply(null, args); } 是否有任何方法可以强键入此项,以便可以像这样调用函数: f( (s: string) => { console.log(s) }, "Hello world!" ) 但是,它是否会因输入错误的参数而失败,或者参数数量不正确 f( (s:

我正在用Typescript编写一个解析器组合器。其中一个函数用于获取另一个具有任何类型签名和一定数量参数的函数,然后调用它:

function f(func, ...args) {
  func.apply(null, args);
}
是否有任何方法可以强键入此项,以便可以像这样调用函数:

f(
  (s: string) => { console.log(s) },
  "Hello world!"
)
但是,它是否会因输入错误的参数而失败,或者参数数量不正确

f(
  (s: string) => { console.log(s) },
  1234.56 // incorrect type
)

f(
  (s: string) => { console.log(s) },
  "Hello",
  "World" // too many arguments
)

(一些附加处理发生在
f
中,这就是我不直接调用
func
的原因)。

虽然不能对任意数量的参数执行此操作,但可以定义一个函数来检查有限数量的参数,并根据需要添加更多参数:

function f<T1>(func: (a1: T1) => void, a1: T1): void;
function f<T1, T2>(func: (a1: T1, a2: T2) => void, a1: T1, a2: T2): void;
function f<T1, T2, T3>(func: (a1: T1, a2: T2, a3: T3) => void, a1: T1, a2: T2, a3: T3): void;
function f<T1, T2, T3, T4>(func: (a1: T1, a2: T2, a3: T3, a4: T4) => void, a1: T1, a2: T2, a3: T3, a4: T4): void;
// Private signature, not publicly available
function f(func: Function, ...args: any[]): void {
    func.apply(null, args);
}
f(
    (s: string) => { console.log(s) },
    1234.56 // incorrect type
)

f(
    (s: string) => { console.log(s) },
    "Hello",
    "World" // will accept more arguments  
)

您是指任何函数及其参数,还是特别指您显示的函数?我的意思是,
f(func:(s:string)=>void,arg:string):void将适用于您所展示的内容,但我感觉这并不容易……GitHub上的相关问题:@MikeMcCaughan我希望传入任何带有任何签名的函数。为了清晰起见编辑了这个问题。是的,我也这么认为@NathanFriend的链接显示它还没有出现。这是你想要的,但现在不是打字脚本。现在,您必须通过重载定义参数列表。@NathanFriend和Mike-很高兴知道,谢谢!直到现在我才知道“变异种类”这个词。
function f2<T1>(func: (a1: T1) => void): (a1: T1) => void;
function f2<T1, T2>(func: (a1: T1, a2: T2) => void): (a1: T1, a2: T2) => void;
function f2<T1, T2, T3>(func: (a1: T1, a2: T2, a3: T3) => void): (a1: T1, a2: T2, a3: T3) => void;
function f2<T1, T2, T3, T4>(func: (a1: T1, a2: T2, a3: T3, a4: T4) => void): (a1: T1, a2: T2, a3: T3, a4: T4) => void;
// Private2 signature, not publicly available
function f2(func: Function) {
    return function (...args: any[]) { func.apply(null, args) };
}
f2((s: string) => { console.log(s) })(1234.56) // type mismatched 

f2((s: string) => { console.log(s) })(
    "Hello",
    "World" // too many arguments
)