単一の値を保持するスーパーコンテナクラスを作成したいと思います。TypeScriptで関数を拡張することはできますか?
let a = new Container(42);
Anが、私は活字体でこれを達成するための方法があります。この
a(); // 42
のような値を取得し、この
a(43);
のような値を設定したいですか?
単一の値を保持するスーパーコンテナクラスを作成したいと思います。TypeScriptで関数を拡張することはできますか?
let a = new Container(42);
Anが、私は活字体でこれを達成するための方法があります。この
a(); // 42
のような値を取得し、この
a(43);
のような値を設定したいですか?
JavaScript/TypeScriptではオペレータのオーバーロードが適切にサポートされていません。 クラスを呼び出そうとしたときに呼び出される関数(コンストラクタを除く)は定義できません。
実際の操作のオーバーロードはないが、操作のオーバーロード[ここの例](https://jsfiddle.net/gvo86g6c/)に似ているものもあります。 –
これをTypeScriptで実現する方法はありますか?
これは単純なJavaScriptで行うことができるので、TypeScriptでも簡単に達成できるはずです。ほとんどの場合、関数では、スコープが我々のアプローチのキーワードです。 もちろん、コンストラクタはクロージャとして誤って使用されます。 typeof
オペレータを介してContainer
。そのようなファクトリ関数は、コンストラクタの囲まれた初期値のゲッタ/セッタとして使用される別のファンクションを返します。平野JavaScriptで
活字体の例...
class Container {
constructor(storageValue: any) {
return (function (value: any) {
if (arguments.length !== 0) {
storageValue = value;
}
return storageValue;
});
}
}
... ...
var Container = (function ContainerClass() {
var Constructor = (function Container (storageValue) {
return (function (value) {
if (arguments.length !== 0) {
storageValue = value;
}
return storageValue;
});
});
return Constructor;
}());
var a = new Container(24);
console.log("a() : ", a()); // 24
console.log("a(4) : ", a(4)); // 4
console.log("a() : ", a()); // 4
var b = new Container(72);
console.log("b() : ", b()); // 72
console.log("b(5) : ", b(5)); // 5
console.log("b() : ", b()); // 5
console.log("a() : ", a()); // 4
'if(UNDEFINED_VALUE!== value){'の代わりに 'arguments.length === 0'を使う方が良いかもしれません。' a() 'と' a(undefined) 'は2つの異なるものです。 –
あなたは明らかに正しいです。 –
タイプセーフではありません。どこにでも 'any'を置くと、TypeScriptを使うのは意味がありません。 – Yaroslav
は性質がために何であるかのような音。 – Stilgar