Чому 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{..}
}

Відповіді:


177

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

У TypeScript маркування члена класу як publicабо privateне впливає на створений JavaScript. Це просто інструмент часу для розробки / компіляції, який можна використовувати, щоб зупинити код TypeScript, щоб отримати доступ до речей, які він не повинен.

За допомогою exportключового слова JavaScript додає рядок, щоб додати експортований елемент до модуля. У вашому прикладі: here.SomeClass = SomeClass;.

Отже, концептуально, видимість як під контролем, так publicі privateпризначена лише для інструментальної роботи, тоді як exportключове слово змінює вихід.


1
Дякую за інформацію, я припускаю, що рішення було таким, як ви говорите, щоб уникнути необхідності перевіряти контекст ключового слова, що шкода, оскільки відчувається, що це щось, що приверне кількох людей вгору і справді не має логічної різниці в поведінці те, як ви очікуєте, що громадськість буде діяти, просто полегшує їхню реалізацію.
Грофіт

Дякую за це Врятує мене волосся.
Кент Агілар

1
Це необхідно, якщо ви використовуєте модулі. Якщо ваш додаток спрямований на більшу сторону, модулі, як правило, є кращим вибором, ніж створення великих пакетів / завантаження всіх файлів наперед.
Фентон

@Fenton Ви не мали на увазі "ви могли б стверджувати, що вони повинні були використовувати" public "замість" експорту "?
Алан Евангеліста

@AlanEvangelista ви, безсумнівно, можете так само стверджувати, особливо якщо ваш фон був Java / C #, а не JavaScript.
Фентон

49

До відповіді Стіва Фентона слід додати кілька речей:

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

1
дякую за додаткову інформацію, я повністю погоджуюся з тим, що державний / приватний перебувають на рівні членів, я просто вважаю, що це не достатньо для всіх рівнів доступу. Однак це особиста думка, а ключове слово - це ключове слово, просто хотілося дізнатися більше.
Грофіт

5
Я редагую свою прискіпливу заяву про простоту реалізації та пропоную +1 як вибачення :)
Fenton

2
Я погоджуюся з тим, що ви говорите, але я не згоден із твердженням "Немає відповідного антоніму для експорту" - "імпорт" - це антонім, і це те, що використовує TypeScript, коли ви визначаєте клас, який можна експортувати, імпортуйте його в інші файли export class User { name: string } Ще один файл: import {User} from ""./the_file_path_to_the_user_class; дивіться розділ 3.3 документів nativescript
Адам

3
Як використання ключового слова importдля позначення "це значення не експортується " є відповідним використанням ключового слова?
Райан Кавано

5
"Немає відповідного антоніму для експорту (експорт ??)" - відповідним антонімом для експорту має бути ембарго.
rsp
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.