Как экспортировать модуль TypeScript, чтобы его можно было импортировать как из TypeScript, так и из Node? - PullRequest
0 голосов
/ 03 октября 2018

Допустим, у вас есть следующий модуль TypeScript:

function foo () {
  return 123;
}

//TODO: Export code here

Я хочу экспортировать его таким образом, чтобы его можно было импортировать следующими способами из TypeScript:

import foo from 'foo';
import * as foo from 'foo';

итаким образом из узла:

const foo = require ( 'foo' );

Требования:

  • Мне не нужно, чтобы пользователи моего модуля задавали опцию allowSyntheticDefaultImports
  • Я хочу, чтобы код для экспорта модуля был максимально чистым
  • Я хочу сохранить определения типов

До сих пор я придумал следующие "решения",но они либо недостаточно хорошо сохраняют определения типов, либо слишком многословны:

export = foo['default'] = foo as typeof foo & { default: typeof foo };
export = foo['default'] = foo;

Есть ли лучший способ?

Ответы [ 3 ]

0 голосов
/ 04 октября 2018

Так как вы публикуете как пакет commonjs, вам не нужен rollup / webpack.

Все, что вам нужно, это перенести ваш код в es5 в commonjs с помощью компилятора TypeScript.

Ваш tsconfig.json должен выглядеть следующим образом:

// tsconfig.json
{
  "compilerOptions": {
    "module": "commonjs",
    "moduleResolution": "node",
    "target": "es5",
    "outDir": "dist" // customize this yourself.
    ...
  }
}

А в вашем package.json:

// package.json
{
  "main": "dist/index.js",
  "typings": "dist/inde.d.ts",
  "files": [
    "dist" // customize this yourself.
  ],
  ...
}

Вот пример репозитория, в который вы можете взглянуть:

https://github.com/unional/path-equal

0 голосов
/ 04 октября 2018

Это лучшее, что я мог придумать:

export = Object.assign ( foo, { default: foo } );

Это довольно кратко, определения типов сгенерированы правильно, и их можно импортировать, используя все вышеупомянутые методы.

0 голосов
/ 04 октября 2018

Насколько я знаю, экспорт и импорт в NodeJS пока не поддерживаются.Проверьте эту статью: node-js-syntaxerror-непредвиденный-token-import

И, насколько мне известно, единственный способ использовать синтаксис TypeScript-типов - только в файле .ts, поэтомуМожно скомпилировать необходимые файлы .ts в .js с помощью Babel.

...