UNPKG

rsdi

Version:

TypeScript dependency injection container. Strong types without decorators.

24 lines (23 loc) 1.37 kB
export type DenyInputKeys<T, Disallowed> = T & (T extends Disallowed ? never : T); export type Factory<ContainerResolvers extends ResolvedDependencies> = (resolvers: ContainerResolvers) => ResolvedDependencyValue; 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>; }>; extend: <E extends (container: IDIContainer<ContainerResolvers>) => IDIContainer>(f: E) => ReturnType<E>; get: <Name extends keyof ContainerResolvers>(dependencyName: Name) => ContainerResolvers[Name]; has: (name: string) => boolean; update: <N extends keyof ContainerResolvers, R extends Factory<ContainerResolvers>>(name: StringLiteral<N>, resolver: R) => IDIContainer<{ [n in N]: ReturnType<R>; } & { [P in Exclude<keyof ContainerResolvers, N>]: ContainerResolvers[P]; }>; }; export type ResolvedDependencies = { [k: string]: ResolvedDependencyValue; }; export type ResolvedDependencyValue = any; 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;