Как в TypeScript v2.2.2 создать файл определения для библиотеки Javascript, у которой нет tsd?

Я ищу полный пример или, по крайней мере, лучшие практики для создания файла определения (не обязательно tsd) для библиотеки JavaScript, которая не имеет его в @types или включена в пакет.

До сих пор мне удавалось собрать базовое решение здесь, но оно не похоже, не следует точным указаниям, данным в разделе «Определения» на веб-сайте TypeScript.

В приведенном выше репозитории я использую пакет @google-cloud/datastore, который, насколько я знаю, еще не имеет tsd-файла. Документация достаточно хороша, чтобы я мог создать файл определения вручную для интересующих меня фрагментов, но мне трудно понять, как лучше всего экспортировать такие определения вручную.

В частности, из здесь , там написано:

/*~ This is the module template file for class modules.
 *~ You should rename it to index.d.ts and place it in a folder with the same name as the module.
 *~ For example, if you were writing a file for "super-greeter", this
 *~ file should be 'super-greeter/index.d.ts'
 */

/*~ Note that ES6 modules cannot directly export class objects.
 *~ This file should be imported using the CommonJS-style:
 *~   import x = require('someLibrary');
 *~
 *~ Refer to the documentation to understand common
 *~ workarounds for this limitation of ES6 modules.
 */

/*~ If this module is a UMD module that exposes a global variable 'myClassLib' when
 *~ loaded outside a module loader environment, declare that global here.
 *~ Otherwise, delete this declaration.
 */

Из приведенных выше инструкций следует, что я должен иметь возможность поместить файл index.d.ts в папку за пределами моего каталога node_modules/@types, который имитирует ту же структуру папок, что и мой модуль. Например, в моем репозитории есть каталог верхнего уровня @google-cloud/datastore, содержащий файл index.ts, но из документации следует, что я должен иметь возможность использовать файл index.d.ts; однако ни мои модули, ни компилятор не могут этого найти. Нужна ли для этого опция компилятора?

Во-вторых, правильный ли подход я использовал в репозитории. Этот способ не задокументирован на их веб-сайте, и мне пришлось угадать его, прежде чем прийти к решению. По сути, я импортирую пакет JavaScript google-cloud/datastore в index.ts, добавляю свои типы, а затем экспортирую его для использования моими модулями. Однако мои модули должны ссылаться на пакет по ./@google-cloud/datastore, так как это фактическое расположение определений TypeScript.

Короче говоря, в TypeScript v2.2.2, как лучше всего создавать небольшие локальные файлы определений TypeScript для библиотек JavaScript, которые не содержат tsd?

последствия

Я обновил свой репозиторий с помощью решения, предложенного Алексом, и все работает, как и ожидалось. Я хотел бы отметить, что это, казалось, также работало, просто добавив параметр { "baseUrl": "types" }, но мне было непонятно, почему это будет правильно, поэтому я пошел с предложенным подходом. Флаг --traceResolution чрезвычайно полезен для этого.

В этом примере я включил еще один модуль с определением TypeScript, lodash, чтобы убедиться, что нормальное разрешение модуля по-прежнему правильное.

Моя структура каталогов/файлов:

+ js
  ...
+ node_modules
  + @google-cloud
    + datastore
  + lodash
  + @types
    + lodash
  + ...
+ types
  + @google-cloud
  - index.d.ts
  + datastore
    -  index.d.ts 
- index.ts
- package.json
- tsconfig.json

Разрешение трассировки

Просто для любопытства хочу опубликовать пример неправильного/правильного результата от вызова tsc --traceResolution. Я сократил результаты для ясности.

Неверно без параметра paths TypeScript преобразует @google-cloud/datastore в файл index.js, что неверно.

======== Module name '@google-cloud/datastore' was successfully resolved to 'C:/Users/Kory/Documents/Repos/playground/manual-typescript-definition/node_modules/@google-cloud/datastore/src/index.js'. ========

Исправьте параметр paths. Обратите внимание, что @google-cloud/datastore разрешается в файл index.d.ts, а не в файл JavaScript.

======== Module name '@google-cloud/datastore' was successfully resolved to 'C:/Users/Kory/Documents/Repos/playground/manual-typescript-definition/types/@google-cloud/datastore/index.d.ts'. ========

person BrutalSimplicity    schedule 20.04.2017    source источник
comment
Не могли бы вы поделиться файлом определений, который вы создали?   -  person urish    schedule 22.07.2017
comment
@urish попробуйте github.com/BrutalSimplicity/cloud/tree/ dev/types/src/ Это весь код разработки, полученный при оценке облачной платформы Google, поэтому я не могу сказать, что он полностью функционален. Но есть тесты :)   -  person BrutalSimplicity    schedule 25.07.2017


Ответы (1)


Вы можете использовать параметры компилятора paths и typeRoots, чтобы заставить tsc обнаруживать пользовательские .d.ts файлы. Он будет искать в перечисленных каталогах папки, соответствующие вашему пакету (например, @google-cloud/datastore)

Например

"paths": {
  "*": [
    "types/*"
  ]
},
"typeRoots": [
  "./types"
]

Где types — это папка в корне вашей структуры каталогов, и вы создаете файл types/@google-cloud/datastore/index.d.ts

Вы можете использовать tsc --traceResolution как быстрый способ увидеть, какие файлы/папки tsc рассматривает при поиске определений типов.

person Alex    schedule 20.04.2017
comment
Отличный ответ! TypeScript не облегчит вам задачу. Основываясь на документации, вы можете подумать, что это разрешит использование правильных типов без параметра дополнительных путей. Спасибо за флаг --traceResolution, он проясняет ситуацию. - person BrutalSimplicity; 20.04.2017