TypeScript: Доступ к статическим методам внутри классов (те же или другие)

Предположим, что у нас есть следующий код:

[Test.js file]:
class Test {
    ...
    public static aStaticFunction():void {
          ...

           this.aMemberFunction(); // <- Issue #1.
    }

    private aMemberFunction():void {
          ...

          this.aStaticFunction(); // <- Issue #2.
    }
}

[Another.js file]:
class Another {
    ...

    private anotherMemberFunction():void {
          Test.aStaticFunction(); // <- Issue #3.
    }
}

См. Issue #x. комментарии по вопросам (3) Я хочу обратиться.

Я уже играл с некоторыми настройками, и я пока не понимаю.

Можете ли вы помочь мне понять, как я могу получить доступ к этим методам в трех местах?

Благодарю.

Ответ 1

Ниже приведен код, но есть некоторые важные концепции, которые нужно иметь в виду.

Статический метод не существует ни в одном экземпляре. Для этого есть веские причины:

  1. Его можно вызвать до того, как вы создали new экземпляр
  2. Его можно вызвать извне, поэтому вы не знаете, к какому экземпляру вызов был связан с

Поэтому во всех случаях, когда вы вызываете статический метод, вам нужно использовать полное имя:

Test.aStaticFunction();

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

Чтобы понять, что я имею в виду, подумайте об этой проблеме.

Если я вызову Test.aStaticFunction() извне экземпляра, когда было создано 100 экземпляров, какой экземпляр должен использовать статическую функцию? Невозможно сказать. Если ваш метод должен знать данные из экземпляра или методов вызова в экземпляре, он почти наверняка не должен быть статическим.

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

interface IHasMemberFunction {
    aMemberFunction(): void;
}

class Test {
    public static aStaticFunction(aClass: IHasMemberFunction):void {
           aClass.aMemberFunction();
    }

    private aMemberFunction():void {
          Test.aStaticFunction(this);
    }
}

class Another {
    private anotherMemberFunction():void {
          Test.aStaticFunction(new Test());
    }
}

Ответ 2

this связано с экземпляром, тогда как static члены не зависят от какого-либо экземпляра. Поэтому, если вы хотите получить доступ к членам экземпляра в статическом члене, вам нужно передать его. Однако в этом случае я не вижу причины, чтобы иметь статический член в первую очередь. Я считаю, что вам нужны две функции. один статический и один нестатический. Это делает две разные вещи, поэтому:

class Test {

    public  notaStaticFunction():void {
           this.aMemberFunction(); // <- Issue #1.
    }

    public static aStaticFunction():void {

    }

    private aMemberFunction():void {
          this.notaStaticFunction(); // <- Issue #2.
    }
}

class Another {
    private anotherMemberFunction():void {
          Test.aStaticFunction(); // <- Issue #3.
    }
}

При этом вы можете делиться свойствами между статическими и членскими функциями с использованием статических свойств.

Ответ 3

не используйте имя класса, например Class.staticMethod(), используйте это:

this.constructor.staticMethod()

для сохранения наследования статических методов