TypeScript的变量参数 - 强制执行最后一个参数

时间:2017-06-21 08:08:09

标签: javascript node.js typescript typescript2.0 typescript2.4

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

这样的事情:

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

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

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

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

所以我们有这样的事情:

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
 });
}

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

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

type IVariadicArgs = string | Function;

export interface IBeforeFn {
  (...args: IVariadicArgs[]): void;
}

2 个答案:

答案 0 :(得分:4)

不,你不能按照自己的意愿行事,但你可以将第一个参数作为函数传递,然后传递最后一个参数。而且也不要使用arguments。您可以将其替换为rest参数

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
}

你可以像

一样打电话
foo(yourFunc, 'asd', 'bsd', 'csd');

答案 1 :(得分:2)

虽然通常不能这样做,但您可以定义多个重载,这些重载应涵盖大多数用例:

function variadic(fn: () => void)
function variadic(a: string, fn: () => void)
function variadic(a: string, b: string, fn: () => void)
function variadic(a: string, b: string, c: string, fn: () => void)
function variadic(a: string, b: string, c: string, d: string, fn: () => void)
function variadic(...args: (string | (() => void))[]) {
    // ...
}

variadic(() => 3, "foo") // error
variadic("foo", () => 3) // ok 
variadic("foo", "bar", () => 3) // ok

playground