В 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
рассматривает при поиске определений типов