使用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
操场