import type { AbstractClassType, ClassType } from '../types';
export type Token<T = unknown> = string | symbol | number | bigint | boolean | ClassType<T> | AbstractClassType<T> | Function;
export type ProviderScope = 'singleton' | 'transient' | 'request' | 'http';
export type ClassProvider<T = unknown> = {
    provide: Token<T>;
    useClass: ClassType<T>;
    scope?: ProviderScope;
};
export type ValueProvider<T = unknown> = {
    provide: Token<T>;
    useValue: T;
};
export type ExistingProvider<T = unknown> = {
    provide: Token<T>;
    useExisting: Token<T>;
};
export type FactoryProvider<T = unknown> = {
    provide: Token<T>;
    useFactory: (...args: any[]) => T | Promise<T>;
    deps?: Token[];
    scope?: ProviderScope;
};
export type TargetFactoryProvider<T = unknown> = {
    provide: Token<T>;
    useTargetFactory: (target: ClassType | undefined, ...args: any[]) => T | Promise<T>;
    deps?: Token[];
    scope?: ProviderScope;
};
export type StructuredProvider<T = unknown> = ClassProvider<T> | ValueProvider<T> | ExistingProvider<T> | FactoryProvider<T> | TargetFactoryProvider<T>;
export type Provider<T = unknown> = ClassType<T> | Function | StructuredProvider<T>;
export declare function isStructuredProvider(provider: Provider): provider is StructuredProvider;
export declare function getProviderToken(provider: Provider): Token;
export declare function getProviderScope(provider: Provider): ProviderScope;
//# sourceMappingURL=provider.d.ts.map