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

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