【问题标题】:Variadic arguments with TypeScript - enforce last argumentTypeScript 的可变参数 - 强制执行最后一个参数
【发布时间】:2017-11-24 00:22:23
【问题描述】:

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

类似这样的:

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

【问题讨论】:

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


【解决方案1】:

不,你不能随心所欲,但你可以将第一个参数作为函数传递,然后是最后一个参数。也不要使用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');

【讨论】:

  • 你能举一个使用休息参数的例子吗?我不明白你的意思。
  • 你的例子不是暗示 func 在列表中排在第一位吗?我需要它最后来。
  • @AlexanderMills 如果你对函数的最后一项没有任何要求,因为rest参数必须是最后一项,所以首先使用它。而且同时接受两种类型的参数也不是一个好习惯
  • 如果 fn 排在最后,那就太好了,因为这样你就可以传递一个匿名函数体并保持“视觉上的有序”。
  • @Lee 你可以。您需要像 ...args: (string | number)[] 声明
【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    • 2023-01-18
    • 1970-01-01
    • 2014-07-23
    • 1970-01-01
    相关资源
    最近更新 更多