Use funções de tipo forte em JavaScript (mais ou menos)

Veja a essência aqui.

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