2016-04-23 2 views
1

単一の値を保持するスーパーコンテナクラスを作成したいと思います。TypeScriptで関数を拡張することはできますか?

let a = new Container(42); 

Anが、私は活字体でこれを達成するための方法があります。この

a(); // 42 

のような値を取得し、この

a(43); 

のような値を設定したいですか?

+0

は性質がために何であるかのような音。 – Stilgar

答えて

2

JavaScript/TypeScriptではオペレータのオーバーロードが適切にサポートされていません。 クラスを呼び出そうとしたときに呼び出される関数(コンストラクタを除く)は定義できません。

+0

実際の操作のオーバーロードはないが、操作のオーバーロード[ここの例](https://jsfiddle.net/gvo86g6c/)に似ているものもあります。 –

2

これを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 
+1

'if(UNDEFINED_VALUE!== value){'の代わりに 'arguments.length === 0'を使う方が良いかもしれません。' a() 'と' a(undefined) 'は2つの異なるものです。 –

+0

あなたは明らかに正しいです。 –

+0

タイプセーフではありません。どこにでも 'any'を置くと、TypeScriptを使うのは意味がありません。 – Yaroslav

関連する問題