Совместное использование и изменение объекта между различными классами TypeScript - PullRequest
0 голосов
/ 10 ноября 2018

У меня есть следующий код TypeScript:

class ClassA {
    options: ClassOption;
    B: ClassB;

    constructor() {
        this.B = new ClassB(this.options);
        this.changeOptions();
    }

    changeOptions(): void {
        const newOptions: ClassOption = new ClassOption("something");
        this.options = newOptions;
    } 
}

class ClassB {
    options: ClassOption;

    constructor(opts: ClassOptions) {
        this.options = opts;
    }

    someFunction(): ClassOption {
        return this.options;
    }
}

Проблема в том, что когда я создаю экземпляр ClassA:

const a = new ClassA();

a.B.someFunction(); возвращает undefined вместо новых параметров, которые установлены с помощью метода ClassA s changeOptions.

1 Ответ

0 голосов
/ 10 ноября 2018

Когда в конструкторе 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 не будет ссылаться на новое значение.

Вместо этого вы хотите:

  1. Инициализация ClassA this.options с пустым объектом:

    options: ClassOption = {};
    
  2. Передайте это конструктору ClassB. Никаких изменений здесь не требуется.

  3. При вызове 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());
...