@zxh19890103/wik
Version:
The world-class JavaScript library for building large-scale digital warehouse both on 2D and 3D.
92 lines (91 loc) • 2.9 kB
TypeScript
import { Constructor, AbstractConstructor } from '../../interfaces';
import { IInjector, WithInjector } from '../../interfaces';
/**
* If parent-child relation has not created, we cannot access injector Hierarchically.
*
* You try to create a Child, which is a child of a Parent.
* Both Parent and Child are providers, which means both have injector.
* Child has dependencies of parameters and properties, some of which should come from Parent's providers.
* Now. you firstly create an injector for Child, that's OK.
* But how the dependencies on Parent are obtained ?
*
* Q: How about services are depended by each other?
*/
/**
* be inspired of Angular2.
* @see https://angular.io/guide/hierarchical-dependency-injection
*/
export declare class Injector implements IInjector {
private C;
parent: IInjector;
private values;
private providers;
readonly own: WithInjector;
readonly writeProp: (o: object, prop: string, value: any) => void;
constructor(C: Constructor);
/**
* load or reload providers,
* keep in mind! we don't re-bind the dependencies that have already bound.
*/
loadProviders(): void;
$new<T extends object>(C: Constructor<T>, ...args: any[]): T;
get<T>(token: symbol): T;
/**
* get a service from a provider.
*/
private getService;
}
/**
* must be no-argument
*/
export type InjectToken = symbol;
export type InjectDecratorArgs = [object, string, PropertyDescriptor];
export type GraphNodeTarget = AbstractConstructor;
export interface GraphNode {
/**
* for development
*/
_dev_label?: string;
/**
* constructor parameters dependencies
*/
paramsDeps: GraphNodeDep[];
/**
* Properties dependencies
*/
deps: GraphNodeDep[];
}
export interface TargetGraphNode extends GraphNode {
/**
* target is the class having deps and params deps.
*/
target: GraphNodeTarget;
}
export interface TokenGraphNode extends GraphNode {
/**
* thing's token that would be injected.
*/
token: InjectToken;
}
export type GraphNodeDep = {
parent: TargetGraphNode;
child: TokenGraphNode;
/**
* the property name
*/
symbol: string;
};
export type Provider = {
useClass?: Constructor;
useValue?: any;
useFactory?: () => any;
};
export type ConfigProviderConfigValue = Provider | Constructor;
type ProviderWithSymbol = Provider & {
provide: symbol;
};
export declare const rootInjector: Injector;
export declare function configProviders(target: AbstractConstructor | 'root', config: Record<symbol, ConfigProviderConfigValue> | Array<ProviderWithSymbol>): void;
export declare function getGraphNode(key: GraphNodeTarget | InjectToken): GraphNode;
export declare function createGraphNodeDep(parent: TargetGraphNode, child: TokenGraphNode, symbol?: string | number): GraphNodeDep;
export {};