Как module.export как функцию, так и другие символы

Я хочу создать плагин newman в качестве npm package, а также использовать этот пакет в качестве библиотеки. У меня есть файл src/index.ts, который должен иметь этот экспорт для запуска

// in package newman-reporter-custom/index.ts
module.exports = function(newmanEventEmitter: any, reporterOptions: any, collectionRunOptions: any) {
    ...
};

У меня также есть этот бит в моем package.json: "main": "lib/index.js", и "outDir": "lib", в моем tsconfig.json.

Также я хочу экспортировать некоторые другие классы, чтобы использовать тот же пакет в качестве библиотеки.

// in package newman-reporter-custom/index.ts
import { foo } from "./foo";
export { foo };

Я также хочу экспортировать другие символы из этого index.ts, чтобы мне мог потребоваться проект как библиотека, например

// other npm package index.ts
import { foo } from "newman-reporter-custom";

Однако кажется, что в newman-reporter-custom/index.ts я могу сделать только одно из обоих: либо module.exports = function(...),, либо export { foo };.

Если я попробую что-то отдельно, все, кажется, работает нормально.

Если я попытаюсь сделать и то, и другое (по-разному), либо newman не сможет загрузить мой пакет с такими словами, как TypeError: Reporter is not a constructor, либо я не смогу импортировать пакет как библиотеку с такими ошибками, как TypeError: Class extends value undefined is not a function or null.

Мне кажется, что module.exports может быть либо функцией (конструктором), либо набором символов, но не тем и другим одновременно.

Итак, каков рабочий чистый способ как удовлетворить Ньюмана, так и обеспечить экспорт функции, а также экспортировать другие символы? Я гибкий в том, как я требую один пакет от другого.


person tkruse    schedule 29.11.2018    source источник


Ответы (2)


TypeScript может преобразовывать стандартный синтаксис модуля ECMAScript в любую понравившуюся вам разновидность, поэтому вот пример модуля TypeScript, который экспортирует импортированный элемент:

пример.ts

import { example } from './module';

// Export a function
export function foo() {
    return 2;
}

// Export an imported member
export { example };

И ваш вызывающий код знает только о модуле примера:

import { foo, example } from './example';
person Fenton    schedule 29.11.2018
comment
Вы просто экспортируете 2 именованные функции, но для работы newman мне нужно module.exports = function(), а не именованную функцию, которую можно импортировать. Ньюман в основном сделает Reporter = require("custom-reporter"); var reporter = new Reporter(...); - person tkruse; 29.11.2018
comment
Если вам нужен экспорт по умолчанию, вы можете просто добавить default к вашему экспорту: export default function foo() - person Fenton; 29.11.2018
comment
Я пробовал это, но Ньюман сообщает TypeError: Reporter is not a constructor - person tkruse; 29.11.2018

Решение с использованием отдельного модуля API

Я попытался использовать другой модуль, скажем, src/public.ts, который

// in package newman-reporter-custom/public.ts
import { foo } from "./foo";
export { foo };

А потом в зависимых пакетах

// other npm package index.ts
import { foo } from "newman-reporter-custom/dist/public";

Это решение выглядит немного некрасиво из-за части /dist. (Кажется, обсуждалось здесь https://github.com/nodejs/node/issues/14970)

person tkruse    schedule 29.11.2018