Как я могу экспортировать несколько экземпляров объектов в TypeScript?

#javascript #typescript #ecmascript-6 #inversifyjs

#javascript #typescript #ecmascript-6 #inversifyjs

Вопрос:

Я создаю библиотеку в TypeScript, которая использует систему внедрения зависимостей (InversifyJS) для создания самой себя и разрешения зависимостей внутри. Проблема, с которой я сталкиваюсь, заключается в том, что я хочу предоставить несколько экземпляров из системы внедрения потребителям библиотеки.

В настоящее время я пытаюсь сделать:

 import kernel from "./src/inversify.config";
import EntityManager from './src/manager/entityManager.service';
import StorageService from './src/storage/storage.service';
import LanguageService from './src/language/language.service';

export { kernel.get<EntityManager>(EntityManager) as EntityManagerInstance };
export { kernel.get<EntityManager>(LanguageService) as LanguageServiceInstance };
export { kernel.get<EntityManager>(StorageService) as StorageServiceInstance };
  

Решение, которое я вижу возможным, заключается в использовании фасада для экспорта типов и последующего доступа к ним:

 import EntityManager from './src/manager/entityManager.service';
import StorageService from './src/storage/storage.service';
import LanguageService from './src/language/language.service';
import InjectionFacade from './utils/injection.facede';

export { EntityManager, LanguageService, StorageService, InjectiorFacade }; 
// Usage: 
// import {InjectionFacade, StorageService} from 'entity-manager';
// let injectionFacade: InjectionFacade = InjectionFacade.createAndResolve();
// let storageService: StorageService = injectionFacade.getStorageService();
  

Но проблема в том, что у меня есть еще одна бесполезная абстракция

Есть ли способ реализовать такое решение без потери определений типов и экспорта готовых к использованию объектов?

Ответ №1:

Вы хотели бы использовать переменную с несколькими объявлениями, например

 export const
    EntityManagerInstance = kernel.get<EntityManager>(EntityManager),
    LanguageServiceInstance = kernel.get<EntityManager>(LanguageService),
    StorageServiceInstance = kernel.get<EntityManager>(StorageService);
  

Комментарии:

1. Спасибо — это то, что я хочу (к лучшему или к худшему)

2.Примечание: kernel.get многократный вызов является показателем возможного анти-шаблона kernel.get , который должен использоваться только один раз в корне вашей композиции