TSD: установить локальный файл определения
У меня есть пакет локального узла, написанный на TypeScript, который я хочу использовать в моем реальном проекте. Используя npm, я могу установить локальные пакеты следующим образом:
$ npm install --save /path/to/package
Или же:
$ npm install --save /path/to/package.tar.gz
Это установит необходимые файлы.js в каталог node_modules. В этом пакете также есть сгенерированный файл.d.ts, который я хотел бы установить в свой проект (автоматически связывая его в typings / tsd.d.ts). Но использование следующей команды не имеет никакого эффекта:
$ tsd install /path/to/package/package.d.ts --save
Это говорит >> zero results
, Итак, как установить локальные файлы определений без использования репозитория?
ОБНОВИТЬ:
Я могу просто скопировать мой файл d.ts в каталог typings, и мой текстовый редактор (для меня это Sublime Text с плагином TypeScript) сможет найти объявление. Структура каталога выглядит примерно так:
/my-project/
/typings/
tsd.d.ts - auto-generated by `tsd install`
node/ - I've installed the node definitions
my-package.d.ts - copied or symlinked file
my-project.ts - I'm working here
Однако у меня есть проблема при экспорте единственной функции в module.exports
(exports = function...
в TypeScript). В этом случае экспортируемая функция является своего рода "анонимной" и даже не упоминается в файле d.ts, поэтому мне нужно отредактировать ее вручную.
Мой тестовый пример:
"my-package" предоставляет одну функцию, обычно импортируемую как "myPackage":
export = function myPackage(a: string, b: string) { return a + ' ' + b; };
declaration
установлен в true
в tsconfig.json, так что tsc
Команда сгенерировала файл my-package.d.ts:
declare var _default: (a: string, b: string) => string;
export = _default;
Предполагается, что мой пакет будет использоваться в моем проекте следующим образом:
import myPackage = require('my-package');
myPackage('foo', 'bar');
Тем не менее, TSC не может найти myPackage
, даже если my-package.d.ts
был скопирован в папку для набора текста. Мне нужно отредактировать этот файл, чтобы он выглядел так:
declare var myPackage: (a: string, b: string) => string;
//export = _default; - not needed
Или даже лучше для правильного функционирования require()
:
declare module 'my-package' /* this is the string passed to require() */ {
export = function(a: string, b: string): string;
}
3 ответа
В свой пакет локального узла добавьте typescript > definition
вход в package.json
:
{
"name": "your-package",
...
"typescript": {
"definition": "package.d.ts"
}
}
Затем после установки пакета в вашем проекте выполните команду...
tsd link
... который добавит ссылку на package.d.ts
в вашем проекте tsd.d.ts
файл ( ссылка).
Кроме того, основываясь на ваших изменениях, я бы предложил вам изменить файл определения на что-то вроде этого (обратите внимание на цитаты вокруг my-package
):
declare module "my-package" {
function myPackage(a: string, b: string): string;
export = myPackage;
}
Это заставит его работать со следующим кодом:
import myPackage = require('my-package');
myPackage('foo', 'bar');
Даже если трюк с package.json работает, я предпочитаю инструменты, созданные для этого (tsd или typings).
Я только что нашел ответ для набрав:typings install --save --ambient file:./node_modules/.../file.d.ts
Я думаю, что то же самое с TSD:)
РЕДАКТИРОВАТЬ:
С TypeScript 2.0 набор текста бесполезен.
Просто беги npm i --save-dev @types/some-library
Начиная с TypeScript 1.6 вы можете ссылаться на ваш файл определения типа из вашего package.json, и разрешение модуля TypeScript должно быть в состоянии найти определение типа.
В вашем файле package.json (вашего локального модуля npm) добавьте запись "typings", например
{
"name": "my-package",
"typings": "./relative/path/to/my-package.d.ts"
}
Таким образом, вам совсем не нужно возиться с TSD.
Смотрите TypeScript Wiki: https://github.com/Microsoft/TypeScript/wiki/Typings-for-npm-packages