TypeScript 的可变参数 - 强制最后一个参数

Ale*_*lls 7 javascript node.js typescript typescript2.0 typescript2.4

假设我们有一个接受可变数量参数的函数,我相信它被称为可变参数函数。

像这样的东西:

function foo(){
 let args = Array.from(arguments).map(v => whatever);
  // do something with args
}
Run Code Online (Sandbox Code Playgroud)

此函数的 TypeScript 接口可能如下所示:

interface IVariadicFn {
   (...args: string[]): void,
}
Run Code Online (Sandbox Code Playgroud)

但假设我们期望可变数量的字符串,但最后一个参数我们期望是一个回调函数。

所以我们会有这样的东西:

function variadic(){
 let args = Array.from(arguments)
 let fn = args.pop();
 let $args = args.map(v => whatever);
  // do something with args
 process.nextTick(function(){
   fn(null, $args); // fire the callback, asynchronously
 });
}
Run Code Online (Sandbox Code Playgroud)

有没有办法声明这个函数的 TypeScript 定义?

我现在能做的最好的事情就是:

type IVariadicArgs = string | Function;

export interface IBeforeFn {
  (...args: IVariadicArgs[]): void;
}
Run Code Online (Sandbox Code Playgroud)

Sur*_*yan 3

不,你不能按照你想要的那样做,但你可以将第一个参数作为函数传递,然后是最后一个参数。并且也不要使用arguments. 您可以将其替换为其余参数

interface IVariadicFn {
   (func: Function, ...args: string[]): void,
}

function foo(func: Function, ...args: string[]){
   let arguments = Array.from(args).map(v => whatever);
   // do something with arguments
}
Run Code Online (Sandbox Code Playgroud)

你可以这样打电话

foo(yourFunc, 'asd', 'bsd', 'csd');
Run Code Online (Sandbox Code Playgroud)