Skip to content

Instantly share code, notes, and snippets.

@SuperOleg39
Created May 19, 2019 09:45
Show Gist options
  • Select an option

  • Save SuperOleg39/78afba3d78da6ef0456669750df104a2 to your computer and use it in GitHub Desktop.

Select an option

Save SuperOleg39/78afba3d78da6ef0456669750df104a2 to your computer and use it in GitHub Desktop.
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