2017-10-03 12 views
2

はじめに:この質問にはおそらくインターネット上のどこかの回答があると私は理解していますが、Googleが答えを出すような方法を見つけることができませんでした。Typescriptの同じクラスの2つのオブジェクト間の追加の実装

コンテキスト: 私は、2D空間で移動するオブジェクトを含む小さなプロジェクトに取り組んでいます。それらのオブジェクトのそれぞれは、Vector2Dオブジェクトに含まれる位置を持ちます(x座標、y座標、および位置に関連する他のいくつかのロジックビットを持ちます)。

今は、これらのオブジェクトに対して何らかの演算を実行したいとき(例えば、周囲を動かすなど)、X軸とY軸の計算を分けなければなりません。これは大きな痛みです。

質問:クラス間に演算子( '+'や '*'など)を実装する方法はありますか?別々の変数ごとに別々のロジックを書く必要はありませんか?そしてもしそうなら、それはどのように見えますか?

例: オブジェクトAを4単位右に4個移動したい。

現状:

this.ObjectA.x + = 4;

This.objectA.y + = 4;

理想的な状況: this.ObjectA + = new Vector2D(4,4);

+1

可能な重複[?ん活字体が持っている演算子のオーバーロード](https://stackoverflow.com/questions/36110070/does-typescript-have -operator-overloading) – migajek

+0

@migajek重複と見なすことができます。 – Valthek

+1

@Valthek答えの1つに間違いがないと印をつけてください:) –

答えて

3

短い答え:ここで

は、コードそのものです。

活字体は、はタイプ依存発するTypeScript/issues/5407を参照)が必要となるので、活字体がその機能を実装していませんでした、これまでのところ

を発行します。

私たちがやっていることの一つは、タイプ駆動の発光です。考え方は、TypeScript型は実行時に支配的ではないということです。コードはあなたが書いた類似のJavaScriptに近いです。そのことを考えれば、オペレータのメソッド呼び出しを代用することはそれに反するだろう。

別のTSのメンテナは、彼らがのECMAScript提案プロセスTypeScript/issues/2319を参照)を介して行っていない機能を実装していないと述べました。この背後にある理由は、正式なES構文との将来の可能性を避けることです。

のECMAScript

esdiscuss.orgでこの機能(11年前にいくつかのデート...)についての議論がたくさんあります。 one of the most recentに次のようなコメントがありました:

オペレータオーバーロードの考え方を放棄することをお勧めします。これは起こりそうもありません。それは大幅に最適化の可能性に影響し、広範な型チェックが必要です。さらに、それを実装するブラウザベンダーからの関心はありません。

従って、オペレータのオーバーロードは、これまでのECMAScriptにそれを作ること非常に考えにくいです。演算子のオーバーロードを使用すると、関数呼び出しと同じことを達成することができますだけ糖衣構文であるので

私は何をすべき...

は、クラス:)上の機能を実装します。だから、これに代えて:

this.ObjectA += new Vector2D(4,4); 

は、次の操作を行います。

this.ObjectA.addVector(new Vector2D(4,4)); 
1

"add"メソッドと同様のものが必要ですか?

ここでは、Playground siteでのこの動作の例を示します。 JavaScriptが演算子オーバーロードをサポートしていませんので、ノー:

class Point { 
    x: number; 
    y: number; 

    constructor(x?: number, y?: number) { 
     this.x = x ? x : 0; 
     this.y = y ? y : 0; 
    } 

    add(value: Point): void { 
     this.x += value.x; 
     this.y += value.y; 
    } 
} 

class MovingAroundObject { 
    position: Point = new Point(); 
} 

const movingObject = new MovingAroundObject(); 
alert("movingObject.position.x: " + movingObject.position.x + " | movingObject.position.y: " + movingObject.position.y); 

// A value to change position of the object 
const changePosition = new Point(4, 5); 

// Change the position of the object 
movingObject.position.add(changePosition); 
alert("movingObject.position.x: " + movingObject.position.x + " | movingObject.position.y: " + movingObject.position.y); 

// Change the position of the object again 
movingObject.position.add(changePosition); 
alert("movingObject.position.x: " + movingObject.position.x + " | movingObject.position.y: " + movingObject.position.y); 
関連する問題