Created
May 19, 2019 09:45
-
-
Save SuperOleg39/78afba3d78da6ef0456669750df104a2 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| enum ServicesNames { | |
| WorldService = 'WorldService', | |
| Window = 'WindowService', | |
| DateService = 'DateService', | |
| } | |
| type IServicesList = { | |
| [ServicesNames.WorldService]?: WorldService; | |
| [ServicesNames.Window]?: WindowService; | |
| [ServicesNames.DateService]?: DateService; | |
| }; | |
| type Constructor<S, A extends any[]> = new (...args: A) => S; | |
| class ServiceProvider { | |
| private static instance: ServiceProvider; | |
| private readonly services: IServicesList = {}; | |
| private constructor() {} | |
| static getInstance(): ServiceProvider { | |
| if (!ServiceProvider.instance) { | |
| ServiceProvider.instance = new ServiceProvider(); | |
| } | |
| return ServiceProvider.instance; | |
| } | |
| register<K extends ServicesNames, A extends any[]>( | |
| name: K, | |
| service: Constructor<IServicesList[K], A>, | |
| ...args: A | |
| ): IServicesList[K] { | |
| return this.services[name] = new service(...args); | |
| } | |
| resolve<K extends ServicesNames>(name: K): IServicesList[K] { | |
| return this.services[name]; | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment