节点模块处理可选参数

时间:2016-04-12 20:13:46

标签: javascript node.js npm

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

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

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

"降序"和" cb"是必需的,其他一切都是可选的;这是一段不属于公共API的内部代码,但我仍然需要一种方法来正确处理它。编写逻辑来处理代码库中的这些类型的情况变得棘手。

有谁知道一个好的NPM模块可以处理这种事情?找不到一个。

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

例如:

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模块来处理这种类型的事情。上面看起来并不那么糟糕,但它会变得更加棘手。

3 个答案:

答案 0 :(得分:2)

我不太了解npm模块的必要性 - 如果您使用的是ES2015,您只需在方法声明中指定默认参数(参见MDN article)。

答案 1 :(得分:1)

在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);

语言的语义不允许它,句号。您可以选择更改参数的顺序。如果您将所有必需参数放在首位,最后一个参数可选,那么它将按预期工作。

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);

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

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
});

答案 2 :(得分:0)

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

https://github.com/ORESoftware/pragmatik

如果有人知道某人已经尝试过这样做,请告诉我。在我不那么详尽的搜索中,我没有找到任何东西。

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

实际上,对于在公共/私有API中接受varargs的有限数量的函数,进行额外配置以避免编写自己的代码来执行正确解析特遣队的繁琐,容易出错的任务是值得的。参数。

(通过解构数组的分配可以使用这个库;否则使用它会有点不方便)