节点模块来处理可选的参数

我正在寻找一个可以处理和分配可选参数的Node.js模块。

例如,说我有这个函数签名:

function foo(desc, opts, cb, extra, writable) { 

“desc”和“cb”是必需的,其他的都是可选的; 这是一段内部代码,不是公共API的一部分,但是我仍然需要一种正确处理它的方法。 编写处理代码库中这些types的逻辑的逻辑变得越来越棘手。

有谁知道一个好的NPM模块可以处理这种事情吗? 无法find一个。

我不相信默认参数会解决这个问题。

例如:

 const args = ['description', function(){}, []]; foo.apply(global,args); 

那么如果我有的话会发生什么

 function foo(desc, opts = {}, cb, extra, writable){} 

那么opts会采用函数的值,而不是默认的{}值。

对? 还是错?

这是我现在解决它的方法:

 foo: function foo(desc, opts, cb, extra, writable) { if (typeof desc !== 'string') { SumanErrors.badArgs(suman, true, new Error('Need a description for the test suite.')); } else if (typeof opts === 'function') { writable = extra; extra = cb; cb = opts; opts = {}; } else { if (typeof desc !== 'string') { SumanErrors.badArgs(suman, true, new Error('desc is not a string')); } if (typeof opts !== 'object') { SumanErrors.badArgs(suman, true, new Error('opts is not an object')); } if (typeof cb !== 'function') { SumanErrors.badArgs(suman, true, new Error('cb is not a function')); } } return { desc: desc, opts: opts, cb: cb, extra: extra, writable: writable } } 

只要函数签名符合某些规则,就可以编写一个NPM模块来处理这种types的事情。 上面看起来不那么糟糕,但可能会变得更加棘手。

我不太了解npm模块的需求 – 如果您使用的是ES2015,您可以在方法声明中指定默认参数(请参阅MDN文章 )。

在Javascript中,参数和参数是根据其位置确定的。

 function test(a, b, c) { console.log(a); // 1 console.log(b); // 2 console.log(c); // 3 } test(1, 2, 3); 

意思是说,没有办法做到这一点:

 function test(a, b, c) { b = defaultValue(b); // Assign some default value to b console.log(a); // 1 console.log(b); // 'Default' console.log(c); // 2 } test(1, 2); 

语言的语义不允许它,句号。 你可以select改变参数的顺序。 如果你使所有必需的参数先来,最后一个可选,那么它将按预期工作。

 function test(a, b, c) { c = defaultValue(c); // Assign some default value to c console.log(a); // 1 console.log(b); // 2 console.log(c); // 'Default' } test(1, 2); 

这适用于任何数量的可选参数。

 function test(a, b, c, d, e, f, g, h, i) { c = defaultValue(c); ... i = defaultValue(i); console.log(a); // 1 console.log(b); // 2 console.log(c); // 'Default' ... console.log(i); // 'Default' } test(1, 2); 

如果您不想重新排列参数的顺序,则可以通过传递对象来创build伪命名参数。

 function test(opts) { fillInDefaults(opts); console.log(opts.a); // 1 console.log(opts.b); // 'Default' console.log(opts.c); // 2 console.log(opts.d); // 'Default' } test({ a: 1, c: 2 }); 

我正在研究这个问题的通用解决scheme:

https://github.com/ORESoftware/pragmatik

如果有人知道有人已经试图做到这一点,请让我知道。 在我不完全的search,我没有发现任何东西。

“pragmatik”允许您定义必需的可选的参数, 可选参数的默认值,并将给定的规则放在参数列表中的正确位置。

实际上,对于公有/私有API中接受可变参数的函数的数量有限,值得做一些额外的configuration,以避免编写自己的代码来执行正确parsing或有参数的麻烦,容易出错的任务。

(这个库的使用可以通过解构数组的赋值来实现;否则使用会有点太不方便)