Javascript:如何编写一个接受不同数量参数的函数

时间:2019-06-10 22:05:22

标签: javascript reactjs flowtype

在JS(带有Flow)中,如何定义函数并使用不同数量的参数调用

说我有一个函数,它的参数用flow键入

function fun(
  name: string,
  age?: string,
  gender: string,
  metaData?: {
    hobby: ?string,
    lifeGoal: ?string,
  }
): void {
  // do something
}

这是我想用两种方式称呼它们的方式:

fun('Jimmy', '30', 'male', {hobby: 'ride bike', lifeGoal: 'beat Zerg'});
fun('Kerri', 'female', {hobby: 'transform', lifeGoal: 'beat Terran'});

如果我不想将“ age”放入“ metaData”中,那么如何确保“ female”映射为“ gender”而不是“ age”,因为它们都是字符串类型。

4 个答案:

答案 0 :(得分:2)

这称为“超载”,不是javascript的功能。您可以通过允许函数接受一个对象作为参数来伪造它,并且可以在该对象中填充任何内容。参见以下示例:

function foo(a, b, opts) {
  // ...
  if (opts['test']) { } //if test param exists, do something.. 
}


foo(1, 2, {"method":"add"});
foo(3, 4, {"test":"equals", "bar":"tree"});`

答案 1 :(得分:0)

JavaScript不支持像Python这样的命名参数。

babel-plugin-named-params使得您可以依靠转码(并且可以接受警告):

func(name = 'Kerri', gender = 'gemale'

否则,您可以传递undefined来获取不希望传递的值

fun('Kerri', undefined, 'female' ...

或者使用不是所有属性都应存在的大型对象。但是你说你不需要那个。

答案 2 :(得分:0)

如先前的海报所述,JS中没有重载。但是,您可以创建另一个封装原始函数并始终将null传递给年龄的函数。

新功能

function noAgefun(
  name: string,
  gender: string,
  metaData?: {
    hobby: ?string,
    lifeGoal: ?string,
  }
): void {
   fun(name, null, gender, metaData);
}

原始功能

function fun(
  name: string,
  age?: string,
  gender: string,
  metaData?: {
    hobby: ?string,
    lifeGoal: ?string,
  }
): void {
  // do something
}

答案 3 :(得分:0)

您应该改为传递单个对象:

    function fun(value : {
      name: string,
      age?: string,
      gender: string,
      metaData?: {
        hobby: ?string,
        lifeGoal: ?string,
      }
    }): void {
      // do something
    }

因此将所有参数变成一个对象。

那么,您的示例可以更好地工作:

fun({name: 'Jimmy', age: '30', gender:'male', metadata: {hobby: 'ride bike', lifeGoal: 'beat Zerg'}});

fun({name: 'Kerri', gender:'female', metadata:{hobby: 'transform', lifeGoal: 'beat Terran'}});

流对象类型:https://flow.org/en/docs/types/objects/