私はこれをいじり、カスタムクラスに対してこれを問題なく機能させることができました。
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()
。DI を実行する のバージョンを作成することも考えられます。overload()