我对此进行了修补,并且能够轻松地针对自定义类进行这项工作。
let overloadTest = overload(
[String], function(value) {
console.log('we got a string', value);
},
[Number], function(value) {
console.log('we got a number', value);
},
[String, Number], function(s, n) {
console.log('we got a string AND a number', s, n);
}
[MyCustomClass], function(value) {
console.log('we got a MyCustomClass instance', value);
}
);
有了这个overload
实现:
function overload(...overloads) {
const f = function(...args) {
let constructorArray = args.map(arg => arg.constructor);
let implIndex = f.overloads.findIndex(sig => {
return constructorArray.length === sig.length &&
constructorArray.every((o,i) => o === sig[i])
;
}) + 1;
if (implIndex > 0 && typeof(f.overloads[implIndex]) === 'function') {
return f.overloads[implIndex].apply({}, args);
} else {
const message = "There is no implementation that matches the provided arguments.";
console.error(message, constructorArray);
throw Error(message);
}
};
f.overloads = overloads;
return f;
};
这还不适用于实例方法。但是,它可以延长。
此外,参数列表直接引用构造函数(而不是字符串),这意味着您可以根据需要扩展额外的验证 - 例如,确保每个参数类型实际上是一个函数/构造函数overload()
。您还可以想象创建一个overload()
执行 DI 的版本。