Почему инструмент типизации намеренно создает повторяющиеся наборы типов?

Читая Краткое руководство по Angular 2, я наткнулся на этот раздел в разделе Конфигурация TypeScript:

Конфликты файлов при вводе

Компилятор TypeScript не допускает переопределения типа. Например, он выдает ошибку, если ему дано два определения для типа Promise.

Часто встречаются двойные определения. На самом деле инструмент типизации намеренно создает повторяющиеся наборы типизации (по причинам, которые лучше всего объясняются в другом месте). Посмотрите в структуре проекта папку typings, где мы должны найти что-то вроде:

typings
  browser
    ambient
      es6-shim
        es6-shim.d.ts
  main
    ambient
      es6-shim
        es6-shim.d.ts
  browser.d.ts
  main.d.ts

Типы es6-shim дублируются, а файлы browser.d.ts и main.d.ts имеют перекрывающееся содержимое.

Если я прочитаю информацию о типизации, там будет сказано:

Если вы создаете интерфейсный пакет, рекомендуется использовать typings/browser.d.ts. Типы браузера компилируются, следуя переопределениям полей браузера.

Вопросы:

Почему инструмент типизации намеренно создает повторяющиеся наборы типизации?

Почему рекомендуется использовать typings/browser.d.ts для интерфейсных пакетов?

Я предполагаю, что поддержка поля browser может создавать разные типы?

Если да, то что такое поле browser и каким образом оно меняет типизацию?


person cfischer    schedule 01.03.2016    source источник


Ответы (1)


Ваше предположение было правильным. Typings понимает, что пакеты могут по-разному работать в браузере и в других местах. Эта функция не нужна для большинства распространенных пакетов, потому что изоморфный JS является модным, и многие пакеты работают одинаково во всех средах JS.

Однако, если бы мой код преднамеренно проверял функциональность среды или если бы я хотел, чтобы пользователи не использовали функции, которые не работают в браузере, было бы полезно иметь.

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

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

person Jack Guy    schedule 01.03.2016
comment
Итак, папка main будет содержать определение узла, это то, что вы имеете в виду? - person lbrahim; 28.04.2016
comment
@Ibrahim Node в первую очередь, но и другие среды на основе JS. :) Только не Браузер. - person Jack Guy; 28.04.2016