import { Provider } from './Providers/Provider'; import { Class } from './Providers/ClassProvider'; import { Scope } from './Scope'; interface Cached { value: T; owner: BaseInjector; injector: BaseInjector; } export declare enum InjectFlags { Default = 0, Optional = 1, SkipSelf = 2, Self = 4, SkipCache = 8, DontCache = 16, Scoped = 32, Unscoped = 64 } export declare class TokenNotFoundError extends Error { constructor(token: any); } export declare class InvalidTagProviderError extends Error { constructor(token: any); } export declare class BaseInjector { parent: BaseInjector; scope: Scope; /** * In order to avoid going up the injectors' tree, cache */ protected providersCache?: Map>>; /** * Some dependencies can be cached and don't need to be resolved all the time */ protected cache?: Map>; /** * Associates an identifying token with each provider */ protected providers: Map>; readonly mutable: boolean; constructor(providers?: (Class | Provider)[], parent?: BaseInjector, scope?: boolean | number | Scope); protected add(provider: Class | Provider): void; /** * Traverses up the injector chain looking for a matching token provider. It then analyzes the token and identifies it's scope. */ protected locateInternal(token: any, flags?: InjectFlags, forceProviders?: boolean): [BaseInjector, BaseInjector, Provider, T, boolean]; locate(token: any, flags?: InjectFlags): [Injector, Injector, Provider]; get(token: Class, flags?: InjectFlags): T; get(token: any, flags?: InjectFlags): T; create(constructor: Class, args?: any[], flags?: InjectFlags): T; createChild(providers?: (Class | Provider)[], scope?: boolean | number | Scope): BaseInjector; tag(tag: any, tokens: any[]): void; call(objectClass: T, method: M, ...manualArgs: any[]): T[M] extends ((...args: any[]) => (infer R)) ? R : string; call(objectClass: Class, method: null | undefined, ...manualArgs: any[]): T; } export declare class MutableInjector extends BaseInjector { readonly mutable: boolean; add(provider: Class | Provider): void; set(token: any, provider: Class, scope?: number): void; } export declare class Injector extends BaseInjector { static readonly main: MutableInjector; static get(token: Class, flags?: InjectFlags): T; static get(token: any, flags?: InjectFlags): T; static create(constructor: Class, args?: any[], flags?: InjectFlags): T; static createChild(providers: (Class | Provider)[]): BaseInjector; static createRoot(providers?: (Class | Provider)[], scope?: number): BaseInjector; static add(provider: Class | Provider): void; static set(token: any, provider: Class): void; } export {};