export interface Mapping {
    [name: string]: any;
}
export interface Binding<T extends Mapping, R> {
    (dependencies: Dependencies<T>, providers: Providers<T>, context: Context): R;
    tags?: string[];
}
export interface Provider<R> {
    (): R;
    tags: string[];
}
export declare type Module<T extends Mapping> = {
    [P in keyof T]: Binding<T, T[P]>;
};
export interface Context {
    [key: string]: any;
}
export declare type Dependencies<T extends Mapping> = {
    [P in keyof T]: T[P];
};
export declare type Providers<T extends Mapping> = {
    [P in keyof T]: Provider<T[P]>;
};
export interface Injector<T extends Mapping> {
    dependencies: Dependencies<T>;
    providers: Providers<T>;
    context: Context;
}
export declare function createInjector<T extends Mapping>(mod: Module<T>): Injector<T>;
export declare function singleton<T extends Mapping, R>(binding: Binding<T, R>): Binding<T, R>;
export declare function instance<V>(v: V): Binding<Mapping, V>;
export declare function tagged<T extends Mapping, R>(tags: string[], binding: Binding<T, R>): Binding<T, R>;
export declare function alias<T extends Mapping, K extends keyof T>(name: K): Binding<T, T[K]>;
declare const _default: {
    createInjector: typeof createInjector;
    singleton: typeof singleton;
    instance: typeof instance;
    tagged: typeof tagged;
    alias: typeof alias;
};
export default _default;
