Можно ли получить доступ к переменным из другого класса в Typescript?

Высокий уровень: у меня есть класс A, в котором есть переменная, определенная как «let _somevar». Я ищу способы присвоить значение этой переменной из другого класса, B.

Детали немного сложнее: класс A содержит метод инициализации для ленивой загрузки некоторого модуля, и у него есть переменная "_somevar", которая содержит модуль, который лениво загружается. Класс A также имеет несколько общедоступных методов, которые проверяют, является ли эта переменная нулевой или нет, и выполняются соответствующим образом.

Теперь класс B предоставляет функцию инициализации для синхронной/прямой (не ленивой загрузки) загрузки модуля. Проблема в том, что общедоступные методы из класса A теперь не будут работать, потому что не задано значение "_somevar". Поэтому я пытаюсь установить его из класса B, чтобы можно было использовать общедоступные методы класса A.

Я понимаю, что для этих классов можно выполнить много рефакторинга. но я не владею кодовой базой, и я пытаюсь внести минимальные изменения в код, чтобы он заработал.

Я хотел бы услышать ваши предложения. Благодарю вас!


person DanSoren    schedule 07.12.2017    source источник
comment
Не описывайте свой код. Разместите это.   -  person JB Nizet    schedule 07.12.2017


Ответы (1)


Невозможно получить доступ к переменным в другом классе.

Вы можете получить доступ к общедоступным членам, таким как свойства и методы.

Если вы расширяете класс, подкласс может получить доступ к защищенным членам.

Вот несколько решений, два из них продвигают переменную как свойство. Другой нет.

Конструктор

Если ClassA зависит от инициализации somevar, он может сделать зависимость явной, потребовав зависимость в своем конструкторе. Таким образом, вы не сможете вызвать метод, использующий зависимость, до того, как зависимость будет предоставлена.

class Example {
    constructor(private somevar: SomeVar) {
    }


    myMethod() {
        this._somevar.doSomething();
    }
}

Установить зависимость

Если вы делаете легкое изменение, чтобы решить проблему, вы можете добавить метод, который принимает зависимость:

setDependency(somevar: SomeVar) {
    this.somevar = somevar;
}

Затем вы можете вызвать это перед использованием метода, который в настоящее время не работает. Однако это форма временной связи. setDependency необходимо вызвать перед вызовом myMethod.

Перейти к методу

Метод, который дает сбой, когда зависимость не инициализирована, может быть изменен, чтобы требовать зависимость...

Например, это:

myMethod() {
    this._somevar.doSomething();
}

Становится так:

myMethod(somevar: SomeVar) {
    somevar.doSomething();
}
person Fenton    schedule 07.12.2017