Javascript:如何编写接受不同数量参数的函数
在JS(使用流)中,如何定义函数并使用不同数量的参数调用它 假设我有一个用flow输入参数的函数Javascript:如何编写接受不同数量参数的函数,javascript,reactjs,flowtype,Javascript,Reactjs,Flowtype,在JS(使用流)中,如何定义函数并使用不同数量的参数调用它 假设我有一个用flow输入参数的函数 function fun( name: string, age?: string, gender: string, metaData?: { hobby: ?string, lifeGoal: ?string, } ): void { // do something } 我想用两种方式来称呼他们: fun('Jimmy', '30', 'male', {ho
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'});
如果我不想将“年龄”放入“元数据”中,我如何确保将“女性”映射到“性别”而不是“年龄”,因为它们都是字符串类型。这称为“重载”,不是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"});`
Javascript不支持像Python那样的命名参数 如果您可以依赖于传输,则可以这样做(并注意以下事项): 否则,您可以对不打算传递的值传递
未定义的
fun('Kerri', undefined, 'female' ...
或者在并非所有属性都存在的情况下使用大型对象。但是你说你不需要它。正如前面的海报所提到的,JS中没有重载。但是,您可以创建另一个函数来封装原始函数,并始终将null传递给age
新功能
原函数
您应该传递单个对象:
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'}});
流对象类型:当不应设置年龄时,使用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
}
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'}});