Как контролировать доступ к членам класса для нескольких классов (то есть модификатор доступа с папкой области видимости / пространством имен)? - PullRequest
1 голос
/ 21 февраля 2020

В Java доступ к защищенным членам класса может получить любой класс в пределах одного пакета, но не классы снаружи. Как я могу выполнить sh это в Typescript?

Например, я хочу класс Foo и класс Foo2 (который не наследуется от Foo), который может обращаться к "защищенным" членам друг друга. Но класс Bar вне области (например, моя папка или пространство имен) должен иметь доступ только к элементам publi c.

1 Ответ

1 голос
/ 21 февраля 2020

В настоящее время нет пакета internal модификатора доступа в TS. Возможный обходной путь - использовать escape-люк для protected / private доступа к члену класса:

class Foo { 
  protected f1 = "f1" 
}

class Foo2 {
  protected f2 = "f2"

  public doSomething(foo: Foo) {
    foo["f1"] // this works
  }
}

Вы можете получить доступ к protected члену из другого класса через доступ к свойству с обозначением в скобках.

Да, это работает. Этот обходной путь все еще будет скрывать protected членов от других классов в целом. Предполагая, что Foo и Foo2 находятся в одном пакете и, следовательно, имеют более сильную связь, они могут лучше знать детали реализации другого класса, такие как имя защищенного свойства. Таким образом, этот штрих должен быть действительным и с точки зрения архитектуры.

Если требуется больше безопасности, вы можете создать дополнительные типы Foo и Foo2 для использования с API-интерфейсом publi c вашего подчиненного устройства. пакет, поэтому клиент даже не знает о данном классе:

class Foo implements FooPublic {
  publicProp = 42
  protected foo = "foo"
}

interface FooPublic {
  publicProp: number // only publicProp is visible to client
}

Дополнительное примечание: Существует также правило ESLint с именем import/no-internal-modules, которое принудительно устанавливает, что клиент не может import ваш реальный класс из подмодуля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...