Я ищу полный пример или, по крайней мере, лучшие практики для создания файла определения (не обязательно 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'. ========