Когда в конструкторе ClassA
вы делаете:
this.B = new ClassB(this.options);
this.options
по-прежнему undefined
, поэтому в основном в конструкторе ClassB
вы делаете:
this.options = opt;
Вы просто устанавливаете this.options
на undefined
вместо того, чтобы назначать ему ссылку на ClassA
options
, которая не существует, так как не была инициализирована.
Даже если вы инициализируете options
в ClassA
пустым объектом, если вы назначите (this.options = something
) новое значение, ClassB
не будет ссылаться на новое значение.
Вместо этого вы хотите:
Инициализация ClassA
this.options
с пустым объектом:
options: ClassOption = {};
Передайте это конструктору ClassB
. Никаких изменений здесь не требуется.
При вызове ChangeOptions
, мутируйте тот же объект вместо того, чтобы заменить его новым . Вы можете использовать Object.assign
для объединения обоих объектов:
changeOptions(): void {
const newOptions: ClassOption = new ClassOption("something");
Object.assign(this.options, newOptions);
// Note that after this, `this.options`' reference is preserved.
}
Здесь вы можете увидеть, как он работает на простом JavaScript:
class ClassA {
constructor() {
// 1. Initialise with an empty object:
this.options = {};
// 2. Pass that reference to ClassB instead of undefined:
this.B = new ClassB(this.options);
this.changeOptions();
}
changeOptions() {
// 3. Mutate this.options without changing its reference:
Object.assign(this.options, {
opt1: 1,
opt2: 2,
});
// 3. You can also do it like this:
this.options.opt3 = 3;
}
}
class ClassB {
constructor(options) {
this.options = options;
}
getOptions() {
return this.options;
}
}
const a = new ClassA();
a.changeOptions();
console.log(a.B.getOptions());