Я экспериментирую с некоторыми миксинами в Typescript, и у меня есть основы работы с несколькими различными методами построения миксина.Во всех них я получаю ту же ошибку.
Это мой класс mixin:
export class OnDestroyMixin implements OnDestroy {
public destroyStream: Subject<void> = new Subject();
ngOnDestroy(): void {
console.log(`on destroy from mixin`);
this.destroyStream.next();
this.destroyStream.complete();
}
}
и всякий раз, когда вызывается функция on destroy (после того, как она была смешана с другим классом)this.destroyStream
не существует, поэтому я получаю ошибку Cannot read property 'next' of undefined
.
Я рассмотрел вопрос об установке этого параметра в конструкторе, но я не уверен, как работают конструкторы в миксинах ...
Я предполагаю, что это должно быть возможно.
Используемый мной в настоящее время миксин-метод представляет собой миксин-декоратор:
export function Mixin(baseCtors: Function[]) {
return function (derivedCtor: Function) {
baseCtors.forEach(baseCtor => {
Object.getOwnPropertyNames(baseCtor.prototype).forEach(name => {
const descriptor = Object.getOwnPropertyDescriptor(baseCtor.prototype, name);
if (name === 'constructor')
return;
if (descriptor && (!descriptor.writable || !descriptor.configurable || !descriptor.enumerable || descriptor.get || descriptor.set)) {
Object.defineProperty(derivedCtor.prototype, name, descriptor);
} else {
derivedCtor.prototype[name] = baseCtor.prototype[name];
}
});
});
};
}
который я скопировал откуда-то в Интернете, но, как я уже сказал, япопробовал несколько разных методов, которые по сути копируют свойства из одного прототипа в другой.