OnChange TypeScript decorator

Example fro article https://habrahabr.ru/post/310870/

by Pavel Bogatyrev

TypeScript

class MyClass {
	@OnChange((self: MyClass) => self.onFieldChange)
	public mMyField: number = 42;

	onFieldChange(newVal: number): void {
  	  document.body.innerHTML +=
    	"<li>Changing from " + this.mMyField + " to " + newVal + "</li>";
	}
}

function OnChange<ClassT, T>(callbackGetter: (ClassT) => ((T)=>void)): any {
    return (target: Object, propertyKey: string | symbol) => {
    	// Переменная, где будем хранить значение
      var value: T;
      // Определяем свойство с методами доступа в прототипе класса
      Object.defineProperty(target, propertyKey, {
      	// Обязательно использование function!
        // При использовании лямбды this будет указывать на Window
      	get: function() { return value },
        set: function(newVal: T) {
          if (newVal != value) {
          	// this - текущий объект класса
          	callbackGetter(this).call(this, newVal);
          }
          value = newVal;
        },
        configurable: true,
        enumerable: true
      });
    }
}

var my = new MyClass();
my.mMyField = 43;
my.mMyField = 44;