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

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

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

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

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

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

Это даст следующий код:

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

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

Собственно, это для совместимости Node.js.

Если вы посмотрите на преобразованный код для:

export function foo(){
}

вы получаете:

function foo(){
}
exports.foo = foo;

который является синтаксисом Node.