Запись модулей NPM в Typescript

Я работаю над своим первым модулем NPM. Я кратко работал с typescript раньше, и большая проблема заключалась в том, что для многих модулей не было файлов определения. Поэтому я подумал, что было бы неплохо написать мой модуль в typescript.

Однако я не могу найти никакой информации о том, как это сделать. Я нашел этот связанный вопрос "Могу ли я написать пакет npm в coffeescript?", где люди предлагают только публикацию файлов javascript. Но в отличие от файлов coffeescript файлы typescript могут быть полезны, если они используются в приложении typescript.

Должен ли я включать typescript файлы при публикации модуля NPM, или я должен публиковать только файлы javascript и предоставлять сгенерированные файлы .d.ts определенному типу?

Ответ 1

Вот пример модуля Node, написанного в TypeScript: https://github.com/basarat/ts-npm-module

Вот пример проекта TypeScript, который использует этот примерный модуль https://github.com/basarat/ts-npm-module-consume

В основном вам необходимо:

  • скомпилировать с commonjs и declaration:true
  • сгенерировать файл .d.ts

И затем

  • Пусть ваш идеал читает сгенерированный .d.ts.

Atom- TypeScript просто обеспечивает хороший рабочий процесс вокруг этого: https://github.com/TypeStrong/atom-typescript#packagejson-support

Ответ 2

Рекомендуемый способ в 2018 году с Typescript 2.x:

  • Создайте свой проект как обычно (с тестами и всем остальным)
  • Добавьте declaration: true в tsconfig.json чтобы сгенерировать типизацию.
  • Экспортируйте API через index.ts
  • В package.json укажите ваши сгенерированные наборы. Например, если ваш outDir является dist, добавьте "types": "dist/index.d.ts" в ваш пакет json.
  • В файле package.json укажите свой основной входной файл. Например, если ваш outDir - это dist а основной входной файл - index.js, добавьте "main": "dist/index.js" в ваш package.json.
  • Создайте .npmignore чтобы игнорировать ненужные файлы (например, источник).
  • Опубликовать в npm с помощью npm publish. Использование спецификаций semver для обновлений (исправление/исправление ошибки исправления npm version patch, неразрывные добавления npm version minor, критические изменения api npm version major)

Так как у меня появилось время, чтобы просмотреть все устаревшие ресурсы по этой теме в Интернете (например, на этой странице...), я решил обернуть его в библиотеку "как написать текст" с современный рабочий минимальный пример.

Ответ 3

Это более свежий ответ, используя TypeScript 1.8.10:

Моя структура проекта:

|
|--- src
|--- test
|--- dist     <= My gulp file compiles and places the js, sourcemaps and .d.ts files here
|      |--- src
|      |--- test
|--- typings
.gitignore
.npmignore
gulpfile.js
package.json
README.md
tsconfig.json
tslint.json
typings.json

Я добавил следующее в .npmignore, чтобы избежать включения посторонних файлов и сохранить минимальный минимум, чтобы пакет импортировался и работал:

node_modules/
*.log
*.tgz

src/
test/
gulpfile.js
tsconfig.json
tslint.json
typings.json
typings
dist/test

Мой .gitignore имеет:

typings

# ignore .js.map files
*.js.map
*.js
dist

Мой package.json имеет:

"main": "dist/src/index.js",
"typings":  "dist/src/index.d.ts",

Теперь я запускаю: npm pack

Полученный файл (при распаковке) имеет следующую структуру:

|
|--- dist
|       |--- src
|              |
|              index.js
|              index.js.map
|              index.d.ts
|
package.json
README.md

Теперь я перехожу к проекту, где я хочу использовать его как библиотеку и введите: npm install ./project-1.0.0.tgz

Он успешно устанавливает.

Теперь я создаю файл index.ts в моем проекте, где я только что установил npm import Project = require("project");

Ввод Project. дает мне опции Intellisense, которые были точкой всего этого упражнения.

Надеюсь, это поможет кому-то другому использовать свои проекты TypeScript npm как внутренние библиотеки в своих больших проектах.

PS: Я считаю, что такой подход скомпилирования проектов к модулям npm, которые можно использовать в других проектах, напоминает .dll в мире .NET. Я вполне мог представить проекты, которые организуются в решении VS VS, где каждый проект создает пакет npm, который затем может использоваться в другом проекте в решении как зависимость.

Поскольку мне потребовалось немало времени, чтобы понять это, я разместил его на случай, если кто-то застрял здесь.

Я также разместил его для закрытой ошибки: https://github.com/npm/npm/issues/11546


Этот пример загружен в Github: vchatterji/tsc-seed

Ответ 4

Вы должны опубликовать исходные источники typescript вместо определения типа. В package.json свойство 'types' указывает на файл *.ts.

*.d.ts хороши для аннотирования существующих JS-библиотек, но, как потребитель, я бы лучше прочитал код typescript, чем переключение между определениями типов и сгенерированным JS-кодом с пониженным уровнем.

Ответ 5

В основном я следую предложению Варун Чаттерджи

Но я хотел бы показать полный пример модульного тестирования и покрытия кода и опубликовать его в npm и импортировать их с помощью javascript или typescript

Этот модуль написан с использованием typescript 2.2, и важно настроить привязку prepublish для компиляции кода с помощью tsc, прежде чем публиковать его до npm

https://github.com/sweetim/haversine-position

https://www.npmjs.com/package/haversine-position

Ответ 6

Вы можете использовать autodts, чтобы обрабатывать распространение и использование файлов .d.ts от npm и без поддержки от Atom IDE.

autodts generate свяжет все ваши собственные файлы .d.ts для публикации на npm, а autodts link обрабатывает ссылки на другие установленные пакеты, которые могут не всегда находиться под node_modules в более крупном проекте, разбитом на несколько подпакетов.

Обе команды считывают свои настройки из package.json и tsconfig.json в стиле "условная конфигурация".

Там еще один ответ о stackoverflow и сообщение в блоге с более подробной информацией.