2016-02-23 2 views
2

Я заметил, что многие файлы декларации об окружающей среде declare a namespaceи a module, который просто экспортирует пространство имен, как правило, используя некоторую гимнастику, которую я действительно не понимаю. Например, в react.d.ts вы видите это:Почему объявления ambient используют пространство имен и модуль?

declare namespace __React { 

    ... entire API of the react library ... 

} 

declare module "react" { 
    export = __React; 
} 
  1. Почему одновременно namespace и module? Почему бы просто не объявить модуль с библиотечным API внутри него?
  2. Почему пространство имен называется __React, а не просто React? Это похоже на довольно неудобное имя «не используй меня», но IntelliJ IDEA импортировал все это по всему исходному коду и, похоже, работает.

ответ

6

Этот шаблон используется для поддержки UMD libraries.

Эти библиотеки обычно помещают что-то в глобальную область видимости, если они загружаются через тег <script ...>, но возвращают что-то в загрузчик модуля, если они вызываются через модульную систему, такую ​​как RequireJS, CommonJS или SystemJS.

В TypeScript это означает, что если вы используете 'react', вы должны получить тот же тип, как если бы вы ссылались на глобальный идентификатор React.

Большинство файлов определения просто записывают их .d.ts файлы, так что форма модуля и глобальная переменная всегда присутствуют; авторам React не понравилось, что вы могли случайно обратиться к глобальному React, если вы использовали загрузчик модуля (в этом случае глобальный на самом деле не был бы там), поэтому они разделили объявление на __React, отдельное .d. ts, объявленный глобальным именем React, и объявление модуля для "react".

+0

Спасибо, это было действительно ясное объяснение, и все это имеет смысл сейчас! Что интересно (раздражает), так это то, что IntelliJ IDEA всегда хочет «импортировать Component = __React.Component' вместо' import {Component} из «реагировать», даже если я использую 'module: commonjs'. Для интерфейсов, таких как 'import MouseEventHandler = _React.MouseEventHandler', он работает, я думаю, потому что интерфейс не является ссылочным символом в скомпилированном JS, но для других вещей я получаю' Can not find variable: __React'. Думаю, IDE может быть немного умнее здесь. – Aaron

Смежные вопросы