@tdi2/di-core
Version:
TypeScript Dependency Injection 2 - Core DI framework
48 lines (44 loc) • 1.81 kB
TypeScript
import * as react_jsx_runtime from 'react/jsx-runtime';
import { ReactNode } from 'react';
type Constructor<T = object> = new (...args: any[]) => T;
interface DIContainer {
register<T>(token: string | symbol, implementation: Constructor<T>, scope?: "singleton" | "transient" | "scoped"): void;
resolve<T>(token: string | symbol): T;
has(token: string | symbol): boolean;
createScope(): DIContainer;
registerByInterface<T>(interfaceName: string, implementation: () => T, scope?: "singleton" | "transient" | "scoped"): void;
resolveByInterface<T>(interfaceName: string): T;
hasInterface(interfaceName: string): boolean;
}
interface DIProviderProps {
container?: DIContainer;
children: ReactNode;
}
declare function DIProvider({ container, children }: DIProviderProps): react_jsx_runtime.JSX.Element;
declare function useDI(): DIContainer;
/**
* Hook to resolve a service from the DI container
*/
declare function useService(token: string | symbol): () => never;
/**
* Hook to optionally resolve a service from the DI container
* Returns undefined if the service is not registered
*/
declare function useOptionalService<T>(token: string | symbol): T | undefined;
/**
* Hook to resolve multiple services at once
* Useful for functional components with many dependencies
*/
declare function useServices<T extends Record<string, any>>(serviceMap: {
[K in keyof T]: string | symbol;
}): T;
/**
* Hook for functional DI pattern
* This would be generated by the transformer for functions with marker interfaces
*/
declare function useFunctionalDI<T extends Record<string, any>>(dependencies: Array<{
key: keyof T;
token: string | symbol;
optional?: boolean;
}>): T;
export { DIProvider, useDI, useFunctionalDI, useOptionalService, useService, useServices };