Перейти к содержанию

Контейнер

Контейнер - это способ объединения экспорта из нескольких модулей в один удобный модуль. Сам контейнер представляет собой файл модуля, который реэкспортирует выбранные экспортные данные других модулей.

Представьте себе следующую структуру классов в библиотеке:

1
2
3
4
5
6
7
8
// demo/foo.ts
export class Foo {}

// demo/bar.ts
export class Bar {}

// demo/baz.ts
export class Baz {}

Без контейнера потребителю потребовалось бы три оператора импорта:

1
2
3
import { Foo } from '../demo/foo';
import { Bar } from '../demo/bar';
import { Baz } from '../demo/baz';

Вместо этого вы можете добавить контейнер demo/index.ts, содержащий следующее:

1
2
3
4
// demo/index.ts
export * from './foo'; // реэкспортируем весь экспорт
export * from './bar'; // реэкспортируем весь экспорт
export * from './baz'; // реэкспортируем весь экспорт

Теперь пользователь может импортировать из контейнера все, что ему нужно:

1
import { Foo, Bar, Baz } from '../demo'; // подразумевается demo/index.ts

Именованный экспорт

Вместо экспорта * вы можете выбрать экспорт модуля по имени. Например, предположим, что у baz.ts есть следующие функции:

1
2
3
4
5
6
7
8
9
// demo/foo.ts
export class Foo {}

// demo/bar.ts
export class Bar {}

// demo/baz.ts
export function getBaz() {}
export function setBaz() {}

Если вы предпочитаете не экспортировать getBaz / setBaz из примера, вы можете сначала импортировть и поместить их в переменную, а потом уже экспортировать эту переменную, как показано ниже:

1
2
3
4
5
6
// demo/index.ts
export * from './foo'; // реэкспортируем весь экспорт
export * from './bar'; // реэкспортируем весь экспорт

import * as baz from './baz'; // импортировать как общую переменную
export { baz }; // экспортировать эту переменную

А теперь импорт будет выглядеть так:

1
2
3
4
5
6
import { Foo, Bar, baz } from '../demo'; // подразумевается demo/index.ts

// использование
baz.getBaz();
baz.setBaz();
// и т.д ...

Комментарии