0

汚れチェックやゲッタとセッタの生成を使わずにTypescriptでデータバインディングを行う方法を考えています。私は、静的解析を使用して特定のクラスの特定のフィールドが割り当てられているすべての場所を見つけることが可能かどうかを判断しようとしています(タイプ注釈の完全使用を前提としています)。その目的は、ゲット/セッター(私が思い出したように)がプロパティの割り当てよりもVMを最適化するのが難しいため、インスペクション時にインスタンスからの乱雑さを除去し、ランタイムでより良いものになるシーンの裏側のデータバインディングを処理する関数への呼び出しを生成することです。例えば静的解析を使用して、特定のフィールドへのすべての割り当てを検索します。

export class Vector3 { 

    public x : number; 
    public y : number; 
    public z : number; 
} 

var v0 = new Vector3(); 
v0.x = 1; 
//generate call to Databindings.set(v0, 'x', v0.x); 

function addX(a : Vector3, val : number) : void { 
    a.x += val; 
    //generate call to Databindings.set(a, 'x', a.x); 
} 

addX(a, 10); 

私は私がするVector3のxプロパティのインスタンスへのすべての割り当てを見つける方法を把握することができますことはほぼ確実だが、関数の内部、それはどのように動作するかわからないが、addXインスタンス変数のように呼び出しますエイリアスされます。

私はこの問題にどのようにアプローチできますか?私のプログラムには既にASTがあるとします。

答えて

0

あなたはrttiとプロパティデコレータを使用することができますか、このためにアスペクト指向プログラミングsample

function bind(target: Object, propertyKey: string) { 
    Object.defineProperty(target, propertyKey, { 
     get: function() { 
      return value; 
     }, 
     set: function (val) { 
      value = val; 
      console.log("call Databindings.set(this, " + propertyKey + ", " + val + ")"); 
     }, 
     enumerable: true, 
     configurable: true 
    }); 
} 

class Vector3 { 
    @bind 
    public x : number; 
    @bind 
    public y : number; 
    @bind 
    public z : number; 
} 

var v0 = new Vector3(); 
v0.x = 1; 
//generate call to Databindings.set(v0, 'x', v0.x); 

function addX(a : Vector3, val : number) : void { 
    a.x += val; 
    //generate call to Databindings.set(a, 'x', a.x); 
} 

addX(v0, 10); 
+0

感謝を使用することができますが、私はゲッター/セッターの発生を回避しようとしています。可能であればビルド時にこれを理解したいと思っています – weichsem

+0

ビルド時に設定値を取得できません。どのようなASTをお持ちですか? typescript AST APIを使用してポストプロセッサを書き込むことができます。一般的に、あなたはオブジェクトのクラスを持っていません。 'let arr:IXProp [] = [{x:0}、new Vector3()]; for(arrのキー)key.x = 5; ' – madreason

関連する問題