Реэкспорт модулей ES6 в TS 1.7?

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

тест1.тс;

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

тест2.тс;

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

Я считаю, что тогда я смогу сделать что-то подобное;

комбинированный.ц;

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

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

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

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


person XeroxDucati    schedule 01.01.2016    source источник


Ответы (2)


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

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

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

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

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

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

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

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

Если вы хотите экспортировать 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();
person C Snover    schedule 01.01.2016
comment
Так что это имеет смысл, за исключением одного: является ли index.js частью CommonJS? Если я делаю свой накопитель в util/index.js, выполнение импорта * из '../util' не работает - ../util/index работает.. Это вещь ES6? Мой tsconfig настроен на модуль: commonjs, если это имеет значение. - person XeroxDucati; 02.01.2016
comment
Неявная загрузка файла index.js специфична для Node.js. Лучше не полагаться на эту функциональность, тем более что у вас может быть, например. util.js плюс каталог util с файлом index.js. - person C Snover; 02.01.2016
comment
вот что я собирался сделать - util.js в каталоге верхнего уровня, который экспортирует * из 'util/‹что угодно', но как только у меня будет нетривиальное количество модулей, мой верхний уровень станет довольно уродливым .. есть ли лучший способ разделить утилиту? - person XeroxDucati; 02.01.2016
comment
Блестяще, большое спасибо за этот ответ. Свертывание с пространством имен было именно тем, что я искал. - person Roaders; 21.11.2016

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

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

// combined.ts
export {test1, test3} from './test1'; 
export {test2} from './test2';
person toskv    schedule 01.01.2016