rsdi
Version:
TypeScript dependency injection container. Strong types without decorators.
23 lines (22 loc) • 1.28 kB
TypeScript
export type Factory<ContainerResolvers extends ResolvedDependencies> = (resolvers: ContainerResolvers) => any;
export type ResolvedDependencies = {
[k: string]: any;
};
export type DenyInputKeys<T, Disallowed> = T & (T extends Disallowed ? never : T);
export type Resolvers<CR extends ResolvedDependencies> = {
[k in keyof CR]?: Factory<CR>;
};
export type StringLiteral<T> = T extends string ? string extends T ? never : T : never;
export type IDIContainer<ContainerResolvers extends ResolvedDependencies = {}> = ContainerResolvers & {
add: <N extends string, R extends Factory<ContainerResolvers>>(name: StringLiteral<DenyInputKeys<N, keyof ContainerResolvers>>, resolver: R) => IDIContainer<ContainerResolvers & {
[n in N]: ReturnType<R>;
}>;
update: <N extends keyof ContainerResolvers, R extends Factory<ContainerResolvers>>(name: StringLiteral<N>, resolver: R) => IDIContainer<{
[P in Exclude<keyof ContainerResolvers, N>]: ContainerResolvers[P];
} & {
[n in N]: ReturnType<R>;
}>;
has: (name: string) => boolean;
extend: <E extends (container: IDIContainer<ContainerResolvers>) => any>(f: E) => ReturnType<E>;
get: <Name extends keyof ContainerResolvers>(dependencyName: Name) => ContainerResolvers[Name];
};