Я играю с предложением декораторов второго уровня и обнаружил некоторые проблемы с декораторами классов.В унаследованном декораторе следующий пример работает, потому что декораторы класса приняли в качестве единственного аргумента целевой конструктор, но с предложением этапа 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;
}
}