使用TypeScript的variables参数 – 强制最后一个参数

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

像这样的东西:

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

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

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

但是让我们说我们期望可变数量的string,但最终的参数,我们希望是一个callback函数。

所以我们有这样的东西:

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

不,你不能像你想的那样做,但是你可以把第一个参数作为一个函数,然后是最后一个。 也不要使用arguments 。 您可以用其余参数replace它

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

虽然一般不能这样做,但可以定义多个应该覆盖大多数用例的重载:

 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 

操场