节点模块来处理可选的参数
我正在寻找一个可以处理和分配可选参数的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或有参数的麻烦,容易出错的任务。
(这个库的使用可以通过解构数组的赋值来实现;否则使用会有点太不方便)