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

136

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

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

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

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

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

В результате получится такой код:

module some.namespace.here
{
   public class SomeClass{..}
}
Grofit
источник

Ответы:

177

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

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

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

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

Фентон
источник
1
Спасибо за информацию, я полагаю, что решение было, как вы говорите, избежать необходимости проверять контекст ключевого слова, что является позором, поскольку кажется, что это что-то, что может сбить с толку нескольких людей и действительно не имеет логической разницы в поведении того, как вы ожидаете от общественности действий, просто упрощает их реализацию.
Grofit 02
Спасибо за это. Спасает меня от выдергивания волос.
Кент Агилар
1
Это необходимо, если вы используете модули. Если ваше приложение ориентировано на большую сторону, модули обычно являются лучшим выбором, чем создание больших пакетов / загрузка всех ваших файлов заранее.
Fenton
@Fenton Разве вы не имели в виду, что «вы могли бы возразить, что они должны были использовать« public »вместо« export »?
Алан Евангелиста,
@AlanEvangelista, вы, конечно, тоже можете поспорить с этим, особенно если ваш фон был Java / C #, а не JavaScript.
Фентон,
49

К ответу Стива Фентона можно добавить несколько вещей:

  • export уже означает две разные вещи (в зависимости от того, на верхнем уровне или нет); это означает, что треть, вероятно, хуже, чем добавление public/private
  • Это определенно не для упрощения реализации; дополнительная сложность publicvs exportтривиальна. Мы уже изменили несколько ключевых слов; это не трудно.
  • Видимость членов класса по умолчанию должна быть общедоступной, чтобы соответствовать предложению класса ES6, поэтому нам нужно какое-то ключевое слово, чтобы указать «не общедоступно». Для export( unexport??) нет подходящего антонима , поэтому privateвыбор является логичным. После того, как вы это сделали private, было бы безумием не выбрать в publicкачестве его аналога
  • Использование exportдля изменения видимости во внутренних модулях - лучший вариант согласования с модулями ES6.
Райан Кавано
источник
1
спасибо за дополнительную информацию, я полностью согласен с общедоступным / частным на уровне участников, мне просто показалось странным, что их недостаточно для всех уровней доступа. Однако это личное мнение, а ключевое слово - это ключевое слово, просто хотел узнать больше.
Grofit 02
5
Я редактирую свое дерзкое заявление о простоте реализации и предлагаю +1 в качестве извинения :)
Фентон
2
Я согласен с некоторыми из того, что вы говорите, но я не согласен с утверждением «Нет подходящего антонима для экспорта» - «импорт» - это антоним, и это то, что использует TypeScript, когда вы определяете экспортируемый класс, вы затем импортировать его в другие файлы export class User { name: string } Другой файл: import {User} from ""./the_file_path_to_the_user_class; см. раздел 3.3 документации по nativescript здесь docs.nativescript.org/angular/tutorial/ng-chapter-3
Адам Диамент
3
Как можно использовать importуказание "это значение не экспортируется " в качестве подходящего использования ключевого слова?
Райан Кавано
5
«Нет подходящего антонима для экспорта (неэкспорт ??)» - подходящим антонимом для экспорта должно быть эмбарго.
rsp