export interface Newable < T > { new ( ... args ) : T ; } export interface Abstract < T > { prototype : T ; } export type ServiceIdentifier < T > = string | symbol | Newable < T > | Abstract < T > ; export type ClassType < T > = new ( ... args ) => T ; export const IServiceManager = Symbol . for ( 'IServiceManager' ) ; export interface IServiceManager { add < T > ( serviceIdentifier , constructor , name ? ) : void ; addSingleton < T > ( serviceIdentifier , constructor , name ? ) : void ; addSingletonInstance < T > ( serviceIdentifier , instance , name ? ) : void ; get < T > ( serviceIdentifier , name ? ) : T ; getAll < T > ( serviceIdentifier , name ? ) : T [ ] ; } export const IServiceContainer = Symbol . for ( 'IServiceContainer' ) ; export interface IServiceContainer { get < T > ( serviceIdentifier , name ? ) : T ; getAll < T > ( serviceIdentifier , name ? ) : T [ ] ; }