0

Я подумываю о способах создания привязки данных в машинописном тексте без использования грязной проверки или создания геттеров и сеттеров. Я пытаюсь определить, будет ли возможно (при условии полного использования аннотаций типа) найти все места, которым определенное поле определенного класса назначено для использования статического анализа. Целью было бы генерировать вызовы функций, которые обрабатывают привязку данных за кулисами, которые удаляли бы загромождение из экземпляров при проверке и были бы лучше в среде выполнения, потому что getters/seters (как я помню) сложнее оптимизировать 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); 

Я почти уверен, что я могу понять, как найти все назначения в случаях x собственности VEctor3, но не знаете, как это будет работать внутри вызовов функций, как 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

Вы не можете получить значение настройки во время сборки. Какой у вас АСТ? Вы можете написать постпроцессор, используя API-интерфейс TypScript. В общем, у вас не будет класса объектов. 'let arr: IXProp [] = [{x: 0}, новый Vector3()]; для ключа (пусть ключ из arr) key.x = 5; ' – madreason

 Смежные вопросы

  • Нет связанных вопросов^_^