Что означает «файл без каких-либо деклараций импорта или экспорта верхнего уровня рассматривается как сценарий, содержимое которого доступно в глобальной области»?

#typescript

Вопрос:

Я прочитал это содержимое из документов TS:

 In TypeScript, just as in ECMAScript 2015, any file containing a top-level import or export is considered a module.

Conversely, a file without any top-level import or export declarations is treated as a script whose contents are available in the global scope (and therefore to modules as well).
 

Я в замешательстве: что здесь означает «глобальный охват»?

Например: Если у меня есть 2 файла в одном каталоге: module.ts и global.ts. И функция add определена в global.ts. Могу ли я вызвать функцию add непосредственно в moudle.ts (без добавления импорта из global.ts)? Я попробовал это, но получил ошибку:

 src/index.ts:2:11 - error TS2304: Cannot find name 'add'.
 

Ответ №1:

Модули имеют свою собственную область применения. Объявления верхнего уровня в модулях не являются глобальными объявлениями, как это было бы в немодульных сценариях.

 <script>
let a = 1; // A global variable
</script>
<script type="module">
let b = 2; // A module-scope variable (not a global)
</script>
<script>
console.log(typeof a); // "number"
console.log(typeof b); // "undefined"
</script> 

В сообщении говорится, что, поскольку у вас есть файл без import или export в нем, TypeScript рассматривает его как сценарий, не являющийся модулем, и оценивает его в глобальном масштабе.

Например: Если у меня есть 2 файла в одном каталоге: module.ts и global.ts. И функция add определена в global.ts. Могу ли я вызвать функцию add непосредственно в moudle.ts (без добавления импорта из global.ts)? Я попробовал это, но получил ошибку:

Да, если:

  1. global.ts уже выполнено, поэтому функция существует; и
  2. TypeScript знает, что add это доступно в глобальном масштабе

Чтобы достичь #2 выше, вы должны объявить add в глобальном пространстве имен в файле объявления или аналогичном.

Но я не рекомендую этого делать. Вместо этого создайте global.ts модуль, экспортировав add его или что-либо еще, что он предоставляет (и, возможно, изменив его имя), и импортируйте из него то, что вам нужно module.ts .