В 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?

отава

Я обновил свой репозиторий решением, предложенным Alex, и все, кажется, работает как ожидалось. Я хотел бы отметить, что это также работает, просто добавив { "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'. ========

1 ответ

Решение

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

Например

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

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

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

Другие вопросы по тегам