Добавление декораторов к динамически создаваемым функциям в машинописи - PullRequest
0 голосов
/ 08 октября 2018

Я создаю динамические функции в машинописи.На эти динамические функции я хочу добавить декораторы.Каков наилучший способ достижения этого сценария?Это возможно?

Например - Хотите достичь чего-то подобного

@decorator1
@decorator2
var dynamicFunction = new Function('a', 'b', 'return a + b');
alert(dynamicFunction(2, 3));

Кроме того, если я создаю несколько динамических функций, как мне добавить к ним декораторы?

напр.

var dynamicFunction:Array<Functions>; 
for (i=0; i<10; i++){
@decorator1
@decorator2
dynamicFunction[i] = new Function('a','b','return a+b');
}

1 Ответ

0 голосов
/ 09 октября 2018

Вы не можете добавлять декораторы к прямым функциям.Из документации Typescript (https://www.typescriptlang.org/docs/handbook/decorators.html):

Декораторы

Декоратор - это специальный вид объявления, который может быть присоединен к объявлению класса, методу, аксессору, свойству или параметру.Декораторы используют форму @expression, где выражение должно вычислять функцию, которая будет вызываться во время выполнения с информацией о декорированном объявлении.

Когда вы пытаетесь, вы видите, что это не работает таким образом,поскольку функция декоратора, написанная сценарием, предполагает, что существует класс, связанный с тем, что декорируется, как указано в документации.

Однако, и я НЕ РЕКОМЕНДУЕМ ЭТОГО , вы могли бы иметьфункции, которые вам нужны внутри класса, тогда будет применяться следующее:

Декораторы метода

Декоратор метода объявляется непосредственно перед объявлением метода. Декоратор применяется к дескриптору свойствадля метода, и может использоваться для наблюдения, изменения или замены определения метода.Декоратор od нельзя использовать в файле объявлений, при перегрузке или в любом другом окружающем контексте (например, в классе объявления).

Выражение для декоратора метода будет вызываться как функция во время выполнения,со следующими тремя аргументами:

  1. Либо функция конструктора класса для статического члена, либо
  2. прототип класса для члена экземпляра.Имя участника.
  3. Дескриптор свойства для члена.

Затем вы можете сделать некрасивый хак, как это машинописный пример Playground

IЯ предоставляю код здесь, для удобства.Хорошая вещь, которую нужно сделать, если вы проверяете машинописную площадку Playground или компилируете этот код, это видеть сгенерированный Javascript, который ясно показывает, что это не было написано для простых функций.не могу думать о необходимости генерации функций таким образом.Может быть, поток внешних логических данных, как механизм правил?В любом случае, динамическое генерирование такого рода сложно проверить и поддерживать, поэтому имейте это в виду и по возможности рассматривайте другие подходы.

...