在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”,因为它们都是字符串类型。
答案 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'}});