Nota: não há suporte para o tipo de retorno, embora isso seja bastante simples, eu acho
function typed (types, cb) {
if (Object.prototype.toString.call(types) === '[object Array]' && typeof cb === "function") {
return function () {
var i = arguments.length, areTypesCorrect = true;
while (i--) {
// need to check for some literals: string/number/boolean
var type = typeof arguments[i], arg;
if (type === 'string') {
arg = new String();
} else if (type === 'number') {
arg = new Number();
} else if (type === 'boolean') {
arg = new Boolean();
} else {
arg = arguments[i];
}
if ( ! (arg instanceof types[i]) ) {
areTypesCorrect = false;
throw new TypeError('Argument '+ (i+1) + ' "' + arguments[i] + '" is not an instance of "' + types[i] + '" ');
break;
}
}
areTypesCorrect && cb.apply(this, arguments);
}
} else {
throw new TypeError('(typed): arguments given are not valid');
}
}
// write your function like this
var myTypedFunction = typed([String, Array], function(str, arr) {
console.log(str, arr)
});
// will work
myTypedFunction('hello', ['world']);
// will not work
myTypedFunction(false, ['world']);