@difizen/mana-syringe
Version:
105 lines • 4.26 kB
TypeScript
import 'reflect-metadata';
import type { Event, Newable, Abstract } from '@difizen/mana-common';
export type TokenOption = {
multiple?: boolean;
global?: boolean;
};
export type Decorator<T> = (target: Newable<T> | Abstract<T>) => any;
export declare namespace Syringe {
/**
* 定义注入标识,默认允许多重注入
*/
const defineToken: (name: string, option?: Partial<TokenOption>) => DefinedToken;
class DefinedToken {
/**
* 兼容 inversify identifier
*/
prototype: any;
protected name: string;
readonly multiple: boolean;
readonly symbol: symbol;
constructor(name: string, option?: Partial<TokenOption>);
}
type Register = <T = any>(token: Syringe.Token<T> | Syringe.InjectOption<T>, options?: Syringe.InjectOption<T>) => void;
type Token<T> = string | symbol | Newable<T> | Abstract<T> | DefinedToken;
type Named = string | symbol | DefinedToken;
type NamedToken<T> = {
token: Token<T>;
named: Named;
};
type OverrideToken<T> = {
token: Token<T>;
override: boolean;
};
type Registry = (register: Register) => void;
type Module = {
id: number;
name?: string;
};
function isModule(data: Record<any, any> | undefined): data is Module;
type Container = {
parent?: Container | undefined;
remove: <T>(token: Syringe.Token<T>) => void;
register: <T = any>(token: Syringe.Token<T> | Syringe.InjectOption<T>, options?: Syringe.InjectOption<T>) => void;
load: (module: Module, force?: boolean, deep?: boolean) => void;
unload: (module: Module) => void;
get: <T>(token: Syringe.Token<T>) => T;
getNamed: <T>(token: Syringe.Token<T>, named: Syringe.Named) => T;
getAll: <T>(token: Syringe.Token<T>) => T[];
getAllNamed: <T>(token: Syringe.Token<T>, named: Syringe.Named) => T[];
isBound: <T>(token: Syringe.Token<T>) => boolean;
isBoundNamed: <T>(token: Syringe.Token<T>, named: Syringe.Named) => boolean;
createChild: () => Container;
onModuleChanged: Event<void>;
onRegistered: Event<void>;
};
type Context = {
container: Container;
};
const ContextToken: Token<Context>;
type UnionToken<T> = Token<T> | NamedToken<T>;
type Class<T> = Newable<T>;
type Factory<T> = (ctx: Context) => (...args: any) => T;
type Dynamic<T> = (ctx: Context) => T;
type MaybeArray<T> = T | T[];
type DecoratorOption<T> = {
token?: MaybeArray<UnionToken<T>>;
contrib?: MaybeArray<Token<T>>;
lifecycle?: Lifecycle;
};
type TargetOption<T> = {
contrib?: MaybeArray<Token<T>>;
} & ValueOption<T>;
type ValueOption<T> = {
useClass?: MaybeArray<Class<T>>;
useDynamic?: MaybeArray<Dynamic<T>>;
useFactory?: MaybeArray<Factory<T>>;
useValue?: T;
};
type InjectOption<T> = DecoratorOption<T> & ValueOption<T>;
enum Lifecycle {
singleton = "singleton",
transient = "transient"
}
const ClassOptionSymbol: unique symbol;
type FormattedInjectOption<T> = {
token: UnionToken<T>[];
contrib: Token<T>[];
useClass: Class<T>[];
lifecycle: Lifecycle;
useDynamic: Dynamic<T>[];
useFactory: Factory<T>[];
useValue?: T;
} & InjectOption<T>;
const DefaultOption: Syringe.InjectOption<any>;
}
export declare namespace Utils {
function toArray<T>(maybeArray: Syringe.MaybeArray<T> | undefined): T[];
function isClass(data?: string | symbol | Record<string, any>): data is Syringe.Class<any>;
function isDefinedToken(data: Record<string, any> | undefined | symbol | string | number): data is Syringe.DefinedToken;
function isInjectOption<T>(data: Syringe.Token<T> | Syringe.InjectOption<T> | undefined): data is Syringe.InjectOption<T>;
function isNamedToken<T>(data: Syringe.UnionToken<T> | undefined): data is Syringe.NamedToken<T>;
function isMultipleEnabled<T>(token: Syringe.Token<T>): boolean;
function toRegistryOption<P>(options: Syringe.InjectOption<P>): Syringe.FormattedInjectOption<P>;
}
//# sourceMappingURL=core.d.ts.map