Wiem, że to dość stare pytanie, ale ostatnio zajmowałem się tym. Daj mi znać, co myślisz o tym rozwiązaniu.
Stworzyłem narzędzie, które pozwala mi silnie wpisywać argumenty i pozostawić je opcjonalne. Zasadniczo zawijasz swoją funkcję w proxy. Jeśli pominiesz argument, jest on niezdefiniowany . Może się to wydawać dziwne, jeśli masz wiele opcjonalnych argumentów tego samego typu obok siebie. (Istnieją opcje przekazywania funkcji zamiast typów do wykonywania niestandardowych sprawdzeń argumentów, a także określanie wartości domyślnych dla każdego parametru).
Tak wygląda implementacja:
function displayOverlay(/*message, timeout, callback*/) {
return arrangeArgs(arguments, String, Number, Function,
function(message, timeout, callback) {
});
};
Dla jasności, oto co się dzieje:
function displayOverlay(/*message, timeout, callback*/) {
return arrangeArgs(
arguments,
String, Number, Function,
function(message, timeout, callback) {
console.log("message", message, "timeout", timeout, "callback", callback);
}
);
};
Możesz wyświetlić kod proxyrangeArgs w moim repozytorium GitHub tutaj:
https://github.com/joelvh/Sysmo.js/blob/master/sysmo.js
Oto funkcja narzędzia z kilkoma komentarzami skopiowanymi z repozytorium:
arrangeArgs: function (/* arguments, config1 [, config2] , callback */) {
var configs = Sysmo.makeArray(arguments),
values = Sysmo.makeArray(configs.shift()),
callback = configs.pop(),
args = [],
done = function() {
if (!args.length) {
args = Array(configs.length);
}
return callback.apply(null, args.concat(values));
};
if (!values.length) {
return done();
}
for (var i = 0; i < configs.length; i++) {
var config = configs[i];
if (values.length) {
var fn = config[0] || config,
validate = (config[1]) ? fn : function(value) {
return value.constructor === fn;
};
if (validate(values[0])) {
args.push(values.shift());
continue;
}
}
args.push(config[2]);
}
return done();
}