как компилятор машинописи обнаруживает пакеты npm с типами? - PullRequest
0 голосов
/ 04 марта 2019

Компилятор машинописного текста можно настроить с помощью tsconfig.json.Это также предлагает настройки для обнаружения файлов определения типа с помощью клавиши typeRoots.

По умолчанию:

По умолчанию все видимые пакеты «@types»включены в ваш сборник.Пакеты в типах node_modules / @ любой вложенной папки считаются видимыми;в частности, это означает, что пакеты находятся внутри ./node_modules/@types/, ../node_modules/@types/, ../../node_modules/@types/ и т. д.

Если указан typeRoots,будут включены только пакеты в typeRoots

Многие пакеты предлагают свои определения типов в отдельном пакете @types/<package-name>. Jquery например.В то же время существуют пакеты, которые поставляются с определениями связанного типа, Firebase делает это.

Почему компилятор машинописи может получать определения Firebase без редактирования параметра typeRoots?Эти определения не находятся в @types и, насколько я понимаю, не должны подбираться по умолчанию.

1 Ответ

0 голосов
/ 04 марта 2019

В документах публикации в TypeScript вы видите, что есть два способа предоставить типы для ваших пользователей: https://www.typescriptlang.org/docs/handbook/declaration-files/publishing.html

  1. связывание с вашим пакетом npm или
  2. публикация в@types organization в npm.

Большие библиотеки, такие как Firebase, имеют свои собственные типы, см. packages / firebase / package.json # L58 или packages / database / package.json # L68 .

Typescripts считывает те файлы, на которые имеются ссылки, в "typings" всех установленных пакетов, на которые есть ссылки в компилируемом коде.

Разница между typeRoots иобычный import 'firebase' - это:

  1. После того, как вы предоставите файлы типов в typeRoot, эти типы всегда используются в процессе компиляции (автоматическое включение).Это отлично подходит для библиотек, изменяющих глобальный контекст, таких как jQuery, узел и т. Д. Они предоставляют глобальные функции, которые в противном случае было бы трудно подобрать.

  2. Вы импортируете его явно, сказав import {Foo} from 'bar'.Если пакет bar имеет свойство typing в свой файл package.json, Typescript подхватит его дополнительно к атрибутам typeRoots.

В документации говорится об этом:

Имейте в виду, что автоматическое включение важно, только если вы используете файлы с глобальными декларациями (в отличие от файлов, объявленных как модули).Например, если вы используете оператор импорта "foo", TypeScript может по-прежнему просматривать папки node_modules & node_modules / @ types для поиска пакета foo.

...