我正在寻找一个可以处理和分配可选参数的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模块来处理这种类型的事情。上面看起来并不那么糟糕,但它会变得更加棘手。
答案 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的有限数量的函数,进行额外配置以避免编写自己的代码来执行正确解析特遣队的繁琐,容易出错的任务是值得的。参数。
(通过解构数组的分配可以使用这个库;否则使用它会有点不方便)