Почему 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 ответа:
основная причина в том, что
exportсоответствует планам для ECMAScript. Вы можете возразить, что "они должны были использовать "экспорт" вместо "публичный", но помимо того, что "экспорт/частный/защищенный" является плохо подобранным набором модификаторов доступа, я считаю, что есть тонкая разница между ними, которая объясняет это.в TypeScript, маркировка члена класса как
publicилиprivateне влияет на созданный JavaScript. Это просто инструмент времени проектирования / компиляции, который вы можете используйте, чтобы остановить ваш код TypeScript доступ к вещам, которые он не должен.С
exportключевое слово, JavaScript добавляет строку для добавления экспортированного элемента в модуль. В вашем примере:here.SomeClass = SomeClass;.так что концептуально видимость контролируется
publicиprivateкак раз для оборудовать, тогда какexportключевое слово изменяет мощность.
несколько вещей, чтобы добавить к ответу Стива Фентона:
exportуже означает две разные вещи (в зависимости от того, находится ли он на верхнем уровне или нет); что означает, что третий, вероятно, хуже, чем добавлениеpublic/private- это определенно не для того, чтобы сделать реализацию проще; дополнительная сложность
publicvsexportтривиально. Мы уже поменяли ключевые слова вокруг группы; это не сложно.- по умолчанию видимость членов класса должны быть публичным, чтобы соответствовать предложению класса ES6, поэтому нам нужно какое-то ключевое слово, чтобы указать "не публичный". Нет подходящего антонима для
export(unexport??), такprivate- это логичный выбор. Послеprivate, было бы несколько безумно не выбратьpublicкак его аналог- использование
exportдля изменения видимости во внутренних модулях лучше всего угадать выравнивание с модулями ES6