Entschuldigen Sie mich für das Erstellen einer neuen Frage, ich konnte keine Frage zu diesem Thema finden.Babel - Dekorator der verzierten Klasseneigenschaften wird vor der Instanziierung der Klasse
Ich habe Schwierigkeiten, meine Abhängigkeitsinjektion mit Mocha und experimentelle es6 + Dekoratoren zu testen, die mit Babel transpiliert werden. Der Klasseneigenschafts-Decorator wird aufgerufen, bevor er hätte sein sollen.
injection.test.js (Mokka-Test, mit --require babel-register
)
import * as DependencyInjection from '../build/decorators/DependencyInjection';
@DependencyInjection.Injectable(service => service.injected = true)
class SampleService {
property = 'default';
constructor(property, ...data) {
this.property = property || this.property;
}
}
class Dependant {
/** @type {SampleService} */
@DependencyInjection.Inject(SampleService)
sampleService;
}
describe('dependency injection',() => {
describe('is decoratored as injectable',() => {
it('should be injectable', done => done(SampleService.injectable ? void 0 : new Error('Injectable is not set')));
it('should contain a predicate', done => done(SampleService.predicate ? void 0 : new Error('Predicate is not set')));
});
describe('inject injectable',() => {
it ('should inject the injectable provider', done => {
const dependant = new Dependant();
done(!!dependant.sampleService ? void 0 : new Error('Injectable provider was not injected'));
})
});
});
Wenn der Test läuft, wird die eingerichtete Klasse des bestimmungsgemäßen umgewandelt. Die sampleService
Eigenschaft der Instanz von Dependant
, die in dem zweiten Test erstellt wird, ist jedoch undefiniert.
Der fragliche Decorator sollte aufgerufen werden/aufgerufen werden, sobald eine Instanz der Klasse erstellt wird, aber der Dekorator wird aufgerufen, wenn die Klasse definiert und die Eigenschaft dekoriert ist. Das erwartete Verhalten wird beibehalten, wenn TypeScript
verwendet wird.
Unten habe ich die (vereinfachte) Dekorateure und meine Babel-Konfiguration aufgelistet.
.babelrc
{
"presets": [
"env",
"stage-0",
"es2017"
],
"plugins": [
"syntax-decorators",
"transform-decorators-legacy",
["transform-runtime", {
"polyfill": false,
"regenerator": true
}]
]
}
exportiert Dekorateur Inject (Targeting class property
):
exports.Inject = (typeFunction, ...data) => {
return function (target, propertyName) {
try {
const injected = target[propertyName] = new typeFunction(data);
if ('predicate' in typeFunction && typeof typeFunction.predicate === 'function') {
typeFunction.predicate(injected);
}
}
catch (err) {
throw new Error(err.message || err);
}
};
};
exportiert Dekorateur injizierbare (Targeting class
):
exports.Injectable = (predicate) => {
return function (target) {
const provider = target;
provider.injectable = true;
if (predicate && typeof predicate === 'function') {
provider.predicate = predicate;
}
};
};