Есть ли способ генерировать пары геттеров и сеттеров в классе машинописи? - PullRequest
0 голосов
/ 06 марта 2019

У меня есть много блоков кода, которые очень похожи и выглядят так:

// BLOCK 1
get computed1() {
  return this.dataComputed1;
}
set computed1(value: any) {
  update(value);
}

// BLOCK 2
get computed2() {
  return this.dataComputed2;
}
set computed2(value: any) {
  update(value);
}

...

Теперь, видя, что «БЛОК 1» и «БЛОК 2» довольно похожи (вырвано из контекста иесли мы посмотрим на это как текст, конечно).Мне интересно, есть ли способ преобразовать этот код, введя какой-то генератор кода (похожий на scss mixins):

// BLOCK 1
makeComputed('computed1');

// BLOCK 2
makeComputed('computed2');

...

Ответы [ 2 ]

1 голос
/ 06 марта 2019

Ниже приведен пример определения геттеров и сеттеров с использованием Object.defineProperty

class Foo {
}

function makeComputed(prop) {
    const field = `data${prop}`;
    Object.defineProperty(Foo.prototype, prop, {
        get: function () {
            console.log(`getting ${field}`);
            return this[field];
        },
        set: function (value) {
            console.log(`updating ${field}`);
            this[field] = value;
        },
        enumerable: true,
        configurable: true
    });
}

makeComputed('computed1');
makeComputed('computed2');

const foo = new Foo();

foo.computed1 = 123;
console.log(foo.computed1);

Обратите внимание - доступ к таким свойствам (две последние строки) приведет к ошибке в Typescript, поскольку он не знает, что Foo теперь имеет computed1 и computed2 реквизитов.

0 голосов
/ 06 марта 2019

Нет простого решения вашей проблемы, вам нужно будет обрабатывать каждый запрос с помощью оператора if / else или switch

function makeComputer(op) {
  switch (op) {
    case 'computed1':
      // logic
      break;
    case 'computer2':
      // logic
      break;
    default:
      // logic
  }
}

Хороший шаблон, который я выбрал, назывался «parm» из Microsoft Dynamics. Это объединяет в себе установщик-получатель, в сочетании с описанным выше подходом вы сможете обрабатывать операции получения / установки и поиска операций в одной функции.

function parmX(x) {
  if (x) this.x = x;
  else return this.x;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...