TypeScript 的可变参数 - 强制执行最后一个参数
Variadic arguments with TypeScript - enforce last argument
假设我们有一个接受可变数量参数的函数,我相信它叫做可变参数函数。
像这样:
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;
}
不,你不能随心所欲,但你可以将第一个参数作为函数传递,然后是最后一个。也不要使用 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');
虽然您通常不能这样做,但您可以定义多个重载,这应该涵盖大多数用例:
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
假设我们有一个接受可变数量参数的函数,我相信它叫做可变参数函数。
像这样:
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;
}
不,你不能随心所欲,但你可以将第一个参数作为函数传递,然后是最后一个。也不要使用 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');
虽然您通常不能这样做,但您可以定义多个重载,这应该涵盖大多数用例:
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