Почему Typescript использует ключевое слово "export", чтобы сделать классы и интерфейсы общедоступными?


при работе с Typescript я понял, что мои классы в модулях (используемых в качестве пространств имен) не были доступны для других классов, если я не написал export ключевое слово перед ними, такие как:

module some.namespace.here
{
   export class SomeClass{..}
}

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

var someVar = new some.namespace.here.SomeClass();

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

Это даст результирующий код, как:

module some.namespace.here
{
   public class SomeClass{..}
}
2 103

2 ответа:

основная причина в том, что export соответствует планам для ECMAScript. Вы можете возразить, что "они должны были использовать "экспорт" вместо "публичный", но помимо того, что "экспорт/частный/защищенный" является плохо подобранным набором модификаторов доступа, я считаю, что есть тонкая разница между ними, которая объясняет это.

в TypeScript, маркировка члена класса как public или private не влияет на созданный JavaScript. Это просто инструмент времени проектирования / компиляции, который вы можете используйте, чтобы остановить ваш код TypeScript доступ к вещам, которые он не должен.

С export ключевое слово, JavaScript добавляет строку для добавления экспортированного элемента в модуль. В вашем примере: here.SomeClass = SomeClass;.

так что концептуально видимость контролируется public и private как раз для оборудовать, тогда как export ключевое слово изменяет мощность.

несколько вещей, чтобы добавить к ответу Стива Фентона:

  • exportуже означает две разные вещи (в зависимости от того, находится ли он на верхнем уровне или нет); что означает, что третий, вероятно, хуже, чем добавление public/private
  • это определенно не для того, чтобы сделать реализацию проще; дополнительная сложность public vs export тривиально. Мы уже поменяли ключевые слова вокруг группы; это не сложно.
  • по умолчанию видимость членов класса должны быть публичным, чтобы соответствовать предложению класса ES6, поэтому нам нужно какое-то ключевое слово, чтобы указать "не публичный". Нет подходящего антонима для export (unexport??), так private - это логичный выбор. После private, было бы несколько безумно не выбрать public как его аналог
  • использование export для изменения видимости во внутренних модулях лучше всего угадать выравнивание с модулями ES6