Класс декоратор с предложением стадии 2 и Babel 7 - PullRequest
0 голосов
/ 23 марта 2019

Я играю с предложением декораторов второго уровня и обнаружил некоторые проблемы с декораторами классов.В унаследованном декораторе следующий пример работает, потому что декораторы класса приняли в качестве единственного аргумента целевой конструктор, но с предложением этапа 2 получает дескриптор объекта.

function log(Class) {
  return (...args) => {
    console.log(`Arguments: ${args}`);

    return new Class(...args);
  };
}

@log
class Bar {
  constructor(name, age) { }
}

Я прочитал декораторы предложения tc39 и построил- в декораторах, но это мне не очень помогло.Как сделать так, чтобы этот пример работал с новым декоратором предложений?Можно ли использовать встроенные декораторы с babel?

Чтобы попробовать кое-что, я разработал собственный базовый декоратор обтекания, он работает, как ожидается, для методов, и я хочу расширить его функциональность до класса.

const wrap = f => {
 return wrapped => {
   const { kind } = wrapped;

   if (kind === 'class') {
     return f(wrapped);
   }
   const { descriptor } = wrapped;
   const original = descriptor.value;

   descriptor.value = f(original);

   return { ...wrapped, descriptor };
  };
};

export default wrap;

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

import wrap from './wrap';

const loggerFunction = f => {
  const name = f.name;

  return function test(...args) {
    console.log(`starting ${name} with arguments ${args.join(', ')}`);

    return f.call(this, ...args);
  };
};

export default wrap(loggerFunction);

И я могу использовать его следующим образом:

class Foo {
  @logger
  method(argument) {
    return argument;
  }
}
...