调用具有多个参数的函数的简便方法?

时间:2018-11-08 14:52:27

标签: javascript typescript ecmascript-6

例如,我在Javascript / Typescript中获得了以下功能(真正的功能是从OpenApiGenerator生成的REST Api)

doStuffAsGet(a: string, b: string; c: string; d: string, e: string, ...)

现在,我将仅使用参数c调用该函数,其余应为未定义状态。 有没有一种方法不必只提供这个参数就写很多未定义的内容?

3 个答案:

答案 0 :(得分:1)

可选参数-使用名称后缀?来使参数可选:

function doStuffAsGet(a: string, b: string, c: string, d?: string, e?: string) {

}

doStuffAsGet('a', 'b', 'c');
doStuffAsGet('a', 'b', 'c', 'd');
doStuffAsGet('a', 'b', 'c', 'd', 'e');

您可以将a,b和c设为必填项,但其余选项是可选的(您可以通过适当地使用?选择必须具有的内容)。

您也可以使用默认值-使用=运算符指定默认值:

function doStuffAsGet(a: string, b: string, c: string, d: string = '', e: string = '') {

}

doStuffAsGet('a', 'b', 'c');
doStuffAsGet('a', 'b', 'c', 'd');
doStuffAsGet('a', 'b', 'c', 'd', 'e');

其余参数,其中使用名称前缀...。这会将所有后续参数收集到一个数组中。

function doStuffAsGet(a: string, ...others: string[]) {

}

doStuffAsGet('a', 'b', 'c');
doStuffAsGet('a', 'b', 'c', 'd');
doStuffAsGet('a', 'b', 'c', 'd', 'e');
doStuffAsGet('a', 'b', 'c', 'd', 'e', 'f');

请注意,在上面的示例中,a是必需的,因此您不能使用零参数来调用该函数。再次,您选择需要的和不需要的。

这些组合可以满足您的需求。

答案 1 :(得分:1)

其余参数,解构...以下示例中的所有内容:

要知道的事情:

  • void 0等于undefined
  • ...是点差运算符
  • [,,c]被称为解构

function doStuffAsGet(...args) {
  const [, , c] = args;

  console.log(args[2], c);
}

// Way to call #1
doStuffAsGet('a', 'b', 'c', 'd', 'e');

// Way to call #2
doStuffAsGet(void 0, void 0, 'c', void 0, void 0, void 0);

// Way to call #3
doStuffAsGet(void 0, void 0, 'c');

// Way to call #4
const args = [];

for (let i = 0; i < 2; i += 1) {
  args.push(void 0);
}

doStuffAsGet(...args, 'c');

// Way to call #5
doStuffAsGet(...[0, 1].map(() => void 0), 'c');



正如@Nikhil Aggarwal在评论中所说,您还可以将args变成一个对象,该对象将更易于使用和维护,例如:

function doStuffAsGet({
  a,
  b,
  c,
  d,
}) {
  console.log(c);
}

function doStuffAsGetAlternative(obj) {
  console.log(obj.c);
}

// Way to call #1
doStuffAsGet({
  c: 'hi',
});

// Way to call #1
doStuffAsGet({
  a: 'salut',
  c: 'hi',
  d: 'buenos dias',
});

答案 2 :(得分:0)

我会尝试使用其余运算符和传播运算符,我不知道此功能的目标,因此我无法为您提供帮助,但请查看

https://javascript.info/rest-parameters-spread-operator