Переэкспортирование модулей ES6 в TS 1.7?

Я немного теряюсь в реэкспорте TS. Скажем, я создаю пару тестовых модулей:

test1.ts;

export function test1() {
    return 'test';
}

test2.ts;

export function test2() {
    return 'test';
}

Я верю, что смогу сделать что-то подобное:

combined.ts;

export * from './test1';
export * from './test2';

module.exports = {
    test1: test1,
    test2: test2
};

Но нет такой удачи. Кажется, много вопросов GitHub обсуждают различные подходы к этому, в том числе старый взломать с помощью export import * from './test1', но все они, похоже, утверждают, что действительно означает спецификация ES6, и никто на самом деле не работает.

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

Ответ 1

Вы не должны использовать module.exports, когда работаете с модулями ES; module.exports является частью модулей CommonJS, а не частью модулей EcmaScript.

Свертывание, экспорт напрямую

Ваш правильный модуль сворачивания будет просто:

export * from './test1';
export * from './test2';

Затем, чтобы использовать rollup:

import * as rollup from './combined';
// or `import { test1, test2 } from './combined'`;
// or any other valid import

rollup.test1();
rollup.test2();

Слияние, добавление объектов пространства имен

Если вы хотите экспортировать test1 и test2 с дополнительным пространством имен, используйте синтаксис export {}:

import * as test1 from './test1';
import * as test2 from './test2';
export { test1, test2 };

Тогда использование будет:

import * as rollup from './combined';
rollup.test1.test1();
rollup.test2.test2();

Накопитель, используя разные имена экспорта

Вы также можете перенаправлять имена с помощью as, если у вас есть конфликт имен, как с import:

export { test1 as t1 } from './test1';
export { test2 as t2 } from './test2';

Тогда использование будет:

import * as rollup from './combined';
rollup.t1();
rollup.t2();

Ответ 2

Похоже, вы не можете экспортировать все в модуль с помощью *, даже если вы используете * в качестве localModuleName.

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

// combined.ts
export {test1, test3} from './test1'; 
export {test2} from './test2';