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